前言
开始
1.替换匿名内部类
- 箭头符号左边是参数,右边的表达式或者语句。
- 如果是表达式,不需要花括号,又返回值
- 加入花括号可以让我们写多条语句。
new Thread(() -> {System.out.println("oh yes");}).start();
2.排序
- 在这里参数列表省略了类型,编译时jvm会通过上下文进行类型推断。
String[] strs = new String[]{"h","y","q","1","2","3"};
Collections.sort(Arrays.asList(strs),(o1,o2) -> o1.compareTo(o2));
Arrays.stream(strs).forEach((element)->{System.out.print(element);});
//输出:123hqy
// 使用 :: 的 Lambda 表达式
Arrays.stream(strs).forEach(System.out::println);
3.双冒号操作符
- 双冒号(::)操作符是 Java 中的方法引用
- 使用方式是 对象::方法 如 person -> person.getName()
- 可以使用util.function 包下的Function来接收
- 传入参数是Person,返回值是姓名可用如下来接收
Function<Person,String> = person -> person.getName()
4.自定义功能接口
- @FunctionalInterface让接口定义为支持lambda功能的接口。
@FunctionalInterface
public interface MyFuncInterFace {
public void doSome();
}
- 下面是实现
- 使用lambda表达式,让我们得到了接口的引用,可以直接调用。
- @FunctionalInterface主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错
//使用lambda实例化功能接口对象,供我们调用
MyFuncInterFace my = () -> {System.out.println("我是接口的实现内容")
my.doSome()
5 逻辑操作
String[] strs = new String[]{"h","y","q","1","2","3"};
Predicate<String> predicate = (n) -> n.equals("1");
for(String s : strs){
if(predicate.test(s)){
System.out.println(s);
}
}
6.Stream 操作
- map方法将inputStream中的元素映射给OutputStream中的元素
- 例如下面通过原始数据得到目标数据(原始数据的2倍)
List<Integer> list = Arrays.asList(1,2,3);
list.stream().map((in) -> in*2).forEach(System.out::print);
//输出 246
- 输出原始元素的两倍的的元素集合的 和
- i = i*2
- sum+=i
- reduce()用来组合流中的元素。
Integer sum = list.stream().map((in) -> in*2).reduce((x,y) -> x+y).get();