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)); }