lambda表达式

快速入门

1.初始化数据

public class Demo1 {
    private ArrayList<Integer> arrayList = new ArrayList<Integer>();

    @Before
    public void config() {
        Random random = new Random();
        for (int i = 0; i < 100; i++) {
            arrayList.add(random.nextInt(100));
        }
    }
}

2.传统的排序

@Test
    public void Method() {
        if (!arrayList.isEmpty()) {
            //传统方法
          Collections.sort(arrayList, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1-o2;
                }
            });
            for (Integer i : arrayList) {
                System.out.println(i);
            }
}

3.使用lambda表达式

查看sort方法的源码可得:

  该方法需要Comparator接口的实现

 public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

查看Comparator接口源码可得:

  compare方法需要传入两个比较的参数,返回int值

@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
..... }

所以lambda表达式为:

Collections.sort(arrayList,(Integer a,Integer b)->{return  a-b;});

JDK1.8 提供了很多函数接口

1.断言型接口(Predicate)

源码为:

//表示该接口为函数接口
@FunctionalInterface
public interface Predicate<T> { boolean test(T t); ... }

可得传入一个t返回一个Boolean

例:

//传入的a为Integer类型
//a若>0返回true,反之为false
Predicate<Integer> predicate = a->{if (a>0){ return true; }else{ return false; }};
System.out.println(predicate.test(-1));

console结果为

D:\java\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:F:\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar=2679:F:\IntelliJ IDEA 2018.1.6\bin" -Dfile.encoding=UTF-8 -classpath "F:\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar;F:\IntelliJ IDEA 2018.1.6\plugins\junit\lib\junit-rt.jar;F:\IntelliJ IDEA 2018.1.6\plugins\junit\lib\junit5-rt.jar;D:\java\jre\lib\charsets.jar;D:\java\jre\lib\deploy.jar;D:\java\jre\lib\ext\access-bridge-64.jar;D:\java\jre\lib\ext\cldrdata.jar;D:\java\jre\lib\ext\dnsns.jar;D:\java\jre\lib\ext\jaccess.jar;D:\java\jre\lib\ext\jfxrt.jar;D:\java\jre\lib\ext\localedata.jar;D:\java\jre\lib\ext\nashorn.jar;D:\java\jre\lib\ext\sunec.jar;D:\java\jre\lib\ext\sunjce_provider.jar;D:\java\jre\lib\ext\sunmscapi.jar;D:\java\jre\lib\ext\sunpkcs11.jar;D:\java\jre\lib\ext\zipfs.jar;D:\java\jre\lib\javaws.jar;D:\java\jre\lib\jce.jar;D:\java\jre\lib\jfr.jar;D:\java\jre\lib\jfxswt.jar;D:\java\jre\lib\jsse.jar;D:\java\jre\lib\management-agent.jar;D:\java\jre\lib\plugin.jar;D:\java\jre\lib\resources.jar;D:\java\jre\lib\rt.jar;F:\workspace_idea\out\production\lambda;F:\IntelliJ IDEA 2018.1.6\lib\junit-4.12.jar;F:\IntelliJ IDEA 2018.1.6\lib\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 cn.cg.Demo1,Method
false

Process finished with exit code 0

2.消费型接口(Consumer)

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
...
}

查看源码可得:

  接收t,返回void

例:遍历List数组

  (1)传统方式

arrayList.forEach(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) {
                    System.out.println("匿名实现类的方法"+integer);
                }
            });

  (2)lambda表达式

 arrayList.forEach(a-> System.out.println(a));

3.功能性接口(Function)

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);
...
}

传入t,返回R

例:

  //字符串a是否与字符串-"123"相同
            Function<String, Boolean> f = a -> {
                if ("123".equals(a)) {
                    return true;
                } else {
                    return false;
                }
            };
            System.out.println(f.apply("123"));

 4.其他函数接口

供给型(Supplier)

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

Comparator

@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
...
}

等等.

但凡打上注解:@FunctionalInterface都可作为函数接口

自定义函数接口注意事项

1.加上@FunctionalInterface注解

2.接口中只有唯一的抽象方法,会被编译器默识别

3.多余的抽象方法是object类中的方法,不影响

4.其余方法必须加上default

lambda表达式三种编写方法

1.exexpression 单条语句表达式 

2.statement       语句块

3.rereference 方法引用

前两种不多叙述

方法引用

 

1.实例方法的引用

例:

public String sayHello(String name){
        return name+": say hello";
    }
    @Test
    public void Method() {
        Demo2 d2 = new Demo2();
        Function<String,String> f = d2::sayHello;
        System.out.println( f.apply("jay"));
    }

sayHello方法与Function接口的apply方法相一致;

2.构造方法应用

@Test
    public void Method() {
       Supplier supplier  = Demo2::new;
        System.out.println(supplier.get());
    }

3.基于参数实例方法的引用

 @Test
    public void Method() {
        Comparator<Integer> compare = Integer::compare;
        System.out.println(compare.compare(111,111));

    }

4.静态方法的引用

  @Test
    public void Method() {
        Function<Integer,String> f = String::valueOf;
        System.out.println(f.apply(100));


    }

 

posted @ 2019-05-30 21:59  简单爱1  阅读(214)  评论(0编辑  收藏  举报