Lamdba表达式
当一个接口只有一个形象办法,称为函数式接口,这种接口能够以lamdba表达式来实现,目标是为了更简洁的代码
//1.无参数无返回值 Runnable runnable = new Runnable() { @Override public void run() { System.out.println("hello lamdba"); } }; Runnable r1 = () -> {System.out.println("hello lamdba");}; //lamdba只有一条语句,可省大括号 Runnable r2 = () -> System.out.println("hello lamdba"); //2.一个参数无返回值 Consumer<String> consumer = new Consumer<String>() { @Override public void accept(String s) { System.out.println("hello lamdba"); } }; Consumer<String> consumer1 = (String s) ->System.out.println("hello lamdba"); //可省参数类型 Consumer<String> consumer2 = (s) ->System.out.println("hello lamdba"); //一个参数可省括号 Consumer<String> consumer3 = s ->System.out.println("hello lamdba"); //3.多参数有返回值 Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1, o2); } }; //多参数括号不可省,只有一条return语句,可省return Comparator<Integer> comparator1 = (o1,o2) -> Integer.compare(o1, o2);
总结
-> 右边:lambda形参的参数类型能够省略,当lambda形参只有一个参数能够省略括号
-> 左边:如果lambda体只有一条执行语句省略{},这条语句是return时省略return
办法援用
办法援用是lamdba表达式的一种更简洁的模式
当满足lambda体只有一条执行语句且
1.函数式接口办法中的形象办法的形参列表和返回值类型与援用办法的形参列表和返回值类型雷同
2.函数式接口办法的第一个参数是须要援用办法的调用者,并且第二个参数是须要援用办法的参数
//对象::实例办法 Consumer<String> consumer = s ->System.out.println("hello lamdba"); PrintStream ps = System.out; Consumer<String> consumer1 = ps::print; //类::静态方法 Comparator<Integer> comparator = (o1,o2) -> Integer.compare(o1, o2); Comparator<Integer> comparator1 = Integer::compare; //类::实例办法 Comparator<String> comp = (s1,s2) -> s1.compareTo(s2); Comparator<String> comp1 = String::compareTo; //结构器援用相似办法援用 Supplier<Test> supplier1 = () -> new Test(); Supplier<Test> supplier2 = Test::new; //数组援用相似办法援用 Function<Integer, String[]> func = integer -> new String[integer]; Function<Integer, String[]> func1 = String[]::new;
StreamAPI
Collection关注的是数据的存储,Stream关注的是数据的运算
Java8提供了一套Stream api,应用这套api能够对内存中的数据进行过滤、排序、映射、归约等操作
Stream 本人不会存储元素
Stream 不会扭转源对象。相同,他们会返回一个持有后果的新 Stream
Stream 操作是提早执行的。这意味着他们会等到须要后果的时候才执行
创立Stream
//1.应用汇合创立 List<Integer> list = new ArrayList<>(); Stream<Integer> stream = list.stream(); //2.应用数组创立 Arrays.stream(new int[]{1,2,3}); //3.应用Stream静态方法 Stream.of(1,2,3);
两头操作
1.筛选和切片
//1.1 filter,从流中排除元素 list.stream().filter(n -> n>=2).forEach(System.out::println); //1.2 distinct,从流中去重元素 list.stream().distinct().forEach(System.out::println); //1.3 limit,从流中截断元素 list.stream().limit(1).forEach(System.out::println); //1.4 skip,从流中跳过元素 list.stream().skip(1).forEach(System.out::println);
2.映射
//2.1 map,对Integer,String汇合,间接对汇合的元素做映射 list.stream().map(n -> n+1).forEach(System.out::println); //2.2 flatMap,对<strong style="color:transparent">来源gaodai#ma#com搞@代~码网</strong>汇合中又有汇合,先对汇合中的元素映射为流,再去对流中的元素做操作,最初会将所有的流合并为一个流 List<List<Integer>> listForMap = Arrays.asList(Arrays.asList(1,2),Arrays.asList(2,3)); listForMap.stream().flatMap(n -> n.stream()).map(n -> n+1).forEach(System.out::println);
3.排序
//3.1 sorted,对流中元素排序 list.stream().sorted().forEach(System.out::println); //3.2 sorted(),自定义排序 list.stream().sorted((x,y) -> Integer.compare(y,x)).forEach(System.out::println);
终止操作
1.匹配和查找
allMatch(),anyMatch(),noneMath(),findFirst(),findAny(),count(),max(),min(),forEach()
2.规约
//2.1 reduce,累加 System.out.println(list.stream().reduce(Integer::sum).get());
3.收集
//3.1 collect,转换流到汇合 List<Integer> collectList = list.stream().filter(n -> n >= 2).collect(Collectors.toList()); collectList.stream().forEach(System.out::println);
Option类
ofNullable() 和 orElse() 搭配应用,不确定对象非空
String str ="hello java"; str = null; Optional<String> optional = Optional.ofNullable(str); System.out.println(optional); //orElse(T t1):如果Optional外部的value非空,则返回此value值。如果value为空,则返回t1. String str2 = optional.orElse("hello lamdba"); System.out.println(str2);