1. 程式人生 > 其它 >leetcode二叉樹-最大深度

leetcode二叉樹-最大深度

一、功能介面

Java 8 引入了@FunctionalInterface,一個只有一個抽象方法的介面。編譯器會將任何滿足函式式介面定義的介面視為函式式介面;
這意味著@FunctionalInterface註釋是可選的。

讓我們看看六個基本的功能介面。

介面 簽名 示例
UnaryOperator T apply(T t) String::toLowerCase, Math::tan
BinaryOperator T apply(T t1, T t2) BigInteger::add, Math::pow
Function<T, R> R apply(T t) Arrays::asList, Integer::toBinaryString
Predicate<T, U> boolean test(T t, U u) String::isEmpty, Character::isDigit
Supplier T get() LocalDate::now, Instant::now
Consumer void accept(T t) System.out::println, Error::printStackTrace

二、 Lambda 表示式和方法參考

Java 8 引入了 lambda 表示式來提供函式介面的抽象方法的實現。

public interface Iterable {
//...

default void forEach(Consumer<? super T> var1) {
    Objects.requireNonNull(var1);
    Iterator var2 = this.iterator();

    while(var2.hasNext()) {
        Object var3 = var2.next();
        var1.accept(var3);
    }

}

//......
}

使用Collections.sort示例

新建一個Student類,然後根據id進行排序

@Data
public class Student {

    private Integer id;
    private String name;
    private String age;

使用Collections.sort進行排序


    public List<Student> getStudents(){
        List<Student> result = new ArrayList<>();
        result.add(new Student(1,"小易","21"));
        result.add(new Student(2,"小二","23"));
        result.add(new Student(4,"小思","24"));
        result.add(new Student(3,"小三","24"));
        return result;
    }

    @Test
    public void ComparatorTest(){
        List<Student> listStudent = getStudents();
        for (Student student : listStudent) {
            System.out.println("使用for迴圈遍歷出來"+student);
        }

        System.out.println("========================");

        Collections.sort(listStudent, new Comparator<Student>() {
            @Override
            public int compare(Student t1, Student t2) {
                return t1.getId() - t2.getId();
            }
        });

        System.out.println(listStudent);

    }

使用Lambda 簡化Collections.sort開發

List介面sort直接支援該方法,不再需要使用Collections.sort

    @Test
    public void LambdaComparatorTest(){
        List<Student> listStudent = getStudents();
        for (Student student : listStudent) {
            System.out.println("使用for迴圈遍歷出來"+student);
        }
        System.out.println("========================");

        listStudent.sort(new Comparator<Student>() {
            @Override
            public int compare(Student t1, Student t2) {
                return t1.getId() - t2.getId();
            }
        });
        System.out.println(listStudent);
    }

使用Lambda列印

    @Test
    public void LambdaComparatorTest(){
        System.out.println("===========  for迴圈遍歷  =============");
        List<Student> listStudent = getStudents();
        for (Student student : listStudent) {
            System.out.println("使用for迴圈遍歷出來"+student);
        }
        System.out.println("===========  lambda  =============");

        //lambda
        listStudent.sort((Student t1,Student t2)->t1.getId() - t2.getId());
        System.out.println(listStudent);
        
        System.out.println("===========  在forEach使用lambda 列印  =============");
        
        //lambda也支援print列印
        listStudent.forEach((student -> {System.out.println(student);}));
    }

這一段可以更簡化:listStudent.sort((Student t1,Student t2)->t1.getId() - t2.getId());
如下:簡化了很多,但是缺點別人接手你的程式碼 如果很多程式碼使用lambda有一定難度消化(我以前就是)
listStudent.sort((t1,t2)->t1.getId() - t2.getId());

按名稱排序

        listStudent.sort((Student t1,Student t2)->t1.getName().compareTo(t2.getName()));

待更新