介绍流程:
Lambda表达式
流Stream
Optional
附上思维导图:
1.Lambda表达式
(1)特点:通过表达式来实现相关接口方法,简化使用匿名类的操作,提高代码整洁性。
(2):常见的几种使用方式:
1 public class TestLambda { 2 //常见形式 3 private Math add = (a, b) -> a + b; 4 private Math remove = (int a, int b) -> a - b; 5 private Math decade = (a, b) -> a * b; 6 private Math square = (int a, int b) -> a / b; 7 private Message msg = (a) -> System.out.println("测试" + a); 8 private Map map = new HashMap(); 9 10 @Test 11 //测试 12 public void test() { 13 Integer[] i = new Integer[]{1, 2, 3, 4}; 14 map.put(1, "x"); 15 map.put(2, "y"); 16 //通过表达式实现接口方法 ->有返回值 17 System.out.println(add.caculate(1, 2)); 18 System.out.println(remove.caculate(1, 2)); 19 System.out.println(decade.caculate(1, 2)); 20 System.out.println(square.caculate(1, 2)); 21 //无返回值 22 msg.play(1); 23 //集合的遍历 ->遍历所有值 24 map.forEach((c, v) -> System.out.println(v)); 25 //集合的遍历 ->遍历所有键 26 map.forEach((c, v) -> System.out.println(c)); 27 Arrays.asList(i).sort((a, b) -> { 28 if (a > b) { 29 return a; 30 } 31 return b; 32 }); 33 } 34 } 35 36 //声明为函数式接口:仅包含一个方法,且方法符合Lambda表达式使用规范 37 @FunctionalInterface 38 interface Math { 39 int caculate(int a, int b); 40 } 41 42 @FunctionalInterface 43 interface Message { 44 void play(int a); 45 }
效果截图:
(3)Lambda表达式的优缺点:
优点:使用lambda表达式代替匿名类使用,接口方法实现,提高了代码的整洁性。
缺点:维护较难,对开发人员的要求也比较高。
2.流Stream
(1)特点:能够对集合对象进行包装,对集合元素进行相关操作,如遍历,过滤,去重等等。
(2)常用方法:
1 public class TestStream { 2 private List<String> list = new ArrayList<>(); 3 4 @Test 5 public void test() { 6 list.add(0, "123"); 7 list.add(1, "456"); 8 list.add(2, "789"); 9 list.add(3, "456"); 10 //运用流Stream进行过滤,将内容不是123字符串的内容过滤出来并获得个数 11 System.out.println(list.stream().filter(e -> !e.equals("123")).count()); 12 //集合遍历forEach 13 list.stream().forEach(e -> System.out.println(e)); 14 //将过滤出来的元素再放入一个集合列表中 15 List l2 = (List) list.stream().filter(e -> !e.equals("123")).collect(Collectors.toList()); 16 //操作集合元素去重后拼接成字符串 17 String str = (String) list.stream().distinct().collect(Collectors.joining("-")); 18 System.out.println(str); 19 //遍历 20 l2.stream().forEach(e -> System.out.println(e)); 21 //通过流stream获取新集合的首个Optional元素 22 System.out.println("首元素:" + l2.stream().findFirst()); 23 //通过流Stream去重后元素个数 24 System.out.println("去重后个数为:" + l2.stream().distinct().count()); 25 //lambda表达式的内部可以引用外部变量或局部变量, 26 // 但是不允许在表达式中对该变量进行修改,该变量只能被声明为final 27 int factor = 1; 28 //若修改该变量直接编译错误 29 /* list.stream().forEach(e-> System.out.println(factor++));*/ 30 //使用reduce可以操作集合内元素然后返回一个新值, 31 //可实现自定义值结果获取 32 System.out.println(list.stream().reduce((e, e2) -> { 33 return (Integer.parseInt(e) > Integer.parseInt(e2) ? e : e2); 34 })); 35 } 36 }
数组->流过滤->数组:
集合元素移除不需要的值:
对集合进行判断 是否 符合某条件:
字符串去重:
效果截图:
常用方法图解:
3.Optional
(1)特点:对于那些空对象的存在,在程序运行时报空指针异常使程序无法继续执行的情况下,可以对这类情况进行避免,使用Option类对这类空指针对象进行获取,判断,设默认值等。
(2)常用方法:
1 public class TestOptional { 2 private String str = "abc"; 3 4 @Test 5 public void test() { 6 //判断str对象是否为空 7 Optional<String> optional = Optional.ofNullable(str); 8 //如果为空或者null则返回Optional.empty,不为空返回Optional对象 9 System.out.println(optional); 10 //若对象为空则报空指针异常->如果不确定为空尽量使用ofNullable()方法判断对象是否为空 11 System.out.println(Optional.of(str).get()); 12 //获取与字符串内容为123不相同的字符串值 13 System.out.println("过滤"+optional.filter(e -> !e.equals("123")).get()); 14 //判断当前的对象会否存在且不为空 15 System.out.println("当前对象不为空?"+optional.isPresent()); 16 //对数据元素进行一定的修改,返回修改后的元素 17 System.out.println("map方法修改后:"+optional.map(e-> e+"x").get()); 18 //如果获取的对象为空,那么就返回传入的参数值,如果不为空则返回原有值 19 str=null; 20 Optional<String> optional2 = Optional.ofNullable(str); 21 System.out.println(optional2.orElse("456")); 22 } 23 }
效果截图:
文章待完善。。。