当前位置:   article > 正文

Java8新特性(Lamda、Stream、Option)_lamda 为空返回默认值

lamda 为空返回默认值

目录

Lamda

Stream

 ​编辑

Optional 

案例一:将一段字符串中的一部分进行排序


在Java8中,接口中的抽象方法默认被 public,abstract修饰符修饰,在Java8之前不允许普通方法存在接口中,在java8之后接口中可以存在普通方法,但是必须被static或者default修饰。

Lamda

好处:简化匿名内部类的调用

规范:使用lamda表达式需要依赖函数式接口

  • 一个接口只有一个抽象方法
  • 可以使用被static或者default修饰的方法
  • 接口被@FunctionalInterface修饰

例子

如果lamda表达式只有一个返回值可以不写大括号和return语句

  1. List<Integer> list = Arrays.asList(1, 3, 2, 9, 7);
  2. list.forEach(item-> System.out.println("我是"+item));
  3. Collections.sort(list,(o1,o2)->{return o2-o1;});
  4. System.out.println(list);

Stream

 

  1. +--------------------+ +------+ +------+ +---+ +-------+
  2. | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
  3. +--------------------+ +------+ +------+ +---+ +-------+

  1. //获取集合中大于2、并且经过排序、平方去重的有序集合
  2. List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
  3. List<Integer> collect = numbers.stream()
  4. .filter(item -> item > 2)
  5. .sorted((o1, o2) ->{return o2.compareTo(o1);})
  6. .map(i -> i * i)
  7. .distinct()
  8. .collect(Collectors.toList());
  9. System.out.println(collect);
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.IntSummaryStatistics;
  4. import java.util.List;
  5. import java.util.Random;
  6. import java.util.stream.Collectors;
  7. import java.util.Map;
  8. public class Java8Tester {
  9. public static void main(String args[]){
  10. System.out.println("使用 Java 8: ");
  11. System.out.println("列表: " +strings);
  12. count = strings.stream().filter(string->string.isEmpty()).count();
  13. System.out.println("空字符串数量为: " + count);
  14. count = strings.stream().filter(string -> string.length() == 3).count();
  15. System.out.println("字符串长度为 3 的数量为: " + count);
  16. filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
  17. System.out.println("筛选后的列表: " + filtered);
  18. mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
  19. System.out.println("合并字符串: " + mergedString);
  20. squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
  21. System.out.println("Squares List: " + squaresList);
  22. System.out.println("列表: " +integers);
  23. IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
  24. System.out.println("列表中最大的数 : " + stats.getMax());
  25. System.out.println("列表中最小的数 : " + stats.getMin());
  26. System.out.println("所有数之和 : " + stats.getSum());
  27. System.out.println("平均数 : " + stats.getAverage());
  28. System.out.println("随机数: ");
  29. random.ints().limit(10).sorted().forEach(System.out::println);
  30. // 并行处理
  31. count = strings.parallelStream().filter(string -> string.isEmpty()).count();
  32. System.out.println("空字符串的数量为: " + count);
  33. }
  34. }

  1. 使用 Java 8:
  2. 列表: [abc, , bc, efg, abcd, , jkl]
  3. 空字符串数量为: 2
  4. 字符串长度为 3 的数量为: 3
  5. 筛选后的列表: [abc, bc, efg, abcd, jkl]
  6. 合并字符串: abc, bc, efg, abcd, jkl
  7. Squares List: [9, 4, 49, 25]
  8. 列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
  9. 列表中最大的数 : 19
  10. 列表中最小的数 : 1
  11. 所有数之和 : 85
  12. 平均数 : 9.444444444444445
  13. 随机数:
  14. -1743813696
  15. -1301974944
  16. -1299484995
  17. -779981186
  18. 136544902
  19. 555792023
  20. 1243315896
  21. 1264920849
  22. 1472077135
  23. 1706423674
  24. 空字符串的数量为: 2

Optional 

  1. import java.util.Optional;
  2. public class Java8Tester {
  3. public static void main(String args[]){
  4. Java8Tester java8Tester = new Java8Tester();
  5. Integer value1 = null;
  6. Integer value2 = new Integer(10);
  7. // Optional.ofNullable - 允许传递为 null 参数
  8. Optional<Integer> a = Optional.ofNullable(value1);
  9. // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
  10. Optional<Integer> b = Optional.of(value2);
  11. System.out.println(java8Tester.sum(a,b));
  12. }
  13. public Integer sum(Optional<Integer> a, Optional<Integer> b){
  14. // Optional.isPresent - 判断值是否存在
  15. System.out.println("第一个参数值存在: " + a.isPresent());
  16. System.out.println("第二个参数值存在: " + b.isPresent());
  17. // Optional.orElse - 如果值存在,返回它,否则返回默认值
  18. Integer value1 = a.orElse(new Integer(0));
  19. //Optional.get - 获取值,值需要存在
  20. Integer value2 = b.get();
  21. return value1 + value2;
  22. }
  23. }

运行结果:

$ javac Java8Tester.java 
$ java Java8Tester
第一个参数值存在: false
第二个参数值存在: true
10

案例一:将一段字符串中的一部分进行排序

  1. public static void main(String[] args) {
  2. String str = "2-5-4-3-8-9";
  3. Integer[] integers = Arrays.stream(str.split("-"))
  4. .map(Integer::parseInt)
  5. .sorted()
  6. .toArray(Integer[]::new);
  7. String s = Arrays.toString(integers).replaceAll(",", "-");
  8. String substring = s.substring(1, s.length() - 1);
  9. System.out.println(substring);
  10. }

案例二:查询list集合中性别时女的数据,如果为空要输出默认值

  1. public static void main(String[] args) {
  2. List<UserEntity> userEntityList = new ArrayList<>();
  3. UserEntity userEntityDefault = new UserEntity();
  4. userEntityList.add(new UserEntity("1", "111", "male"));
  5. userEntityList.add(new UserEntity("2", "222", "female"));
  6. userEntityList.add(new UserEntity("3", "333", "male"));
  7. userEntityList.add(new UserEntity("4", "444", "female"));
  8. UserEntity userEntity1 = userEntityList.stream().filter(s-> Objects.equals(s.getO3(), "male")).findFirst().orElse(userEntityDefault);
  9. System.out.println(userEntity1);
  10. }

案例三

  1. public class Trader{
  2. private String name;
  3. private String city;
  4. public Trader(String n, String c){
  5. this.name = n;
  6. this.city = c;
  7. }
  8. public String getName(){
  9. return this.name;
  10. }
  11. public String getCity(){
  12. return this.city;
  13. }
  14. public void setCity(String newCity){
  15. this.city = newCity;
  16. }
  17. public String toString(){
  18. return "pojo1.Trader:"+this.name + " in " + this.city;
  19. }
  20. }
  1. public class Transaction{
  2. private Trader trader;
  3. private int year;
  4. private int value;
  5. public Transaction(Trader trader, int year, int value)
  6. {
  7. this.trader = trader;
  8. this.year = year;
  9. this.value = value;
  10. }
  11. public Trader getTrader(){
  12. return this.trader;
  13. }
  14. public int getYear(){
  15. return this.year;
  16. }
  17. public int getValue(){
  18. return this.value;
  19. }
  20. public String toString(){
  21. return "{" + this.trader + ", " +
  22. "year: "+this.year+", " +
  23. "value:" + this.value +"}";
  24. }
  25. }

  1. public class Test {
  2. public static void main(String[] args) {
  3. Trader raoul = new Trader("Raoul", "Cambridge");
  4. Trader mario = new Trader("Mario","Milan");
  5. Trader alan = new Trader("Alan","Cambridge");
  6. Trader brian = new Trader("Brian","Cambridge");
  7. Transaction transaction2 = new Transaction(brian, 2011, 300);
  8. List<Transaction> transactions = Arrays.asList(
  9. new Transaction(brian, 2011, 300),
  10. new Transaction(raoul, 2012, 1000),
  11. new Transaction(raoul, 2011, 400),
  12. new Transaction(mario, 2012, 710),
  13. new Transaction(mario, 2012, 700),
  14. new Transaction(alan, 2012, 950)
  15. );
  16. //找出2011年发生的所有交易,并按交易额排序
  17. List<Transaction> collect = transactions.stream().filter(transaction -> transaction.getYear() == 2011).sorted((o1,o2)->o1.getYear()-o2.getYear()).collect(Collectors.toList());
  18. System.out.println(collect);
  19. //交易员在哪些不同的城市工作过
  20. List<String> collect1 = transactions.stream().map(transaction -> transaction.getTrader().getCity()).distinct().collect(Collectors.toList());
  21. System.out.println(collect1);
  22. //查找所有来自剑桥的交易员,并按姓名进行排序并且通过字符串连接返回
  23. String cambridge = transactions.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge")).map(o1 -> o1.getTrader().getName()).distinct().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.joining(", "));
  24. System.out.println(cambridge);
  25. //有没有交易员在米兰工作
  26. /**
  27. * anyMatch表示,判断的条件里,任意一个元素成功,返回true
  28. *
  29. * allMatch表示,判断条件里的元素,所有的都是,返回true
  30. *
  31. * noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true
  32. */
  33. Boolean milanTrader = transactions.stream().anyMatch(transaction ->transaction.getTrader().getCity().equals("milan"));
  34. System.out.println(milanTrader);
  35. //打印生活在剑桥的交易员的所有交易额
  36. transactions.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge")).forEach(o1-> System.out.println(o1.getValue()));
  37. //所有交易中,最高的交易额是多少
  38. Optional<Integer> maxValue = transactions.stream()
  39. .map(Transaction::getValue)
  40. .distinct()
  41. .reduce(Integer::max);
  42. System.out.println(maxValue);
  43. //最小交易额
  44. Integer integer = transactions.stream()
  45. .map(o1 -> o1.getValue())
  46. .distinct()
  47. .reduce(Integer::min).get();
  48. // Optional<Integer> minValue = (Optional<Integer>) integer
  49. System.out.println(integer);
  50. //将一段字符串中的一部分进行排序
  51. String str = "2-5-4-3-8-9";
  52. String collect2 = Arrays.stream(str.split("-")).sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.joining(","));
  53. //
  54. Transaction transaction3 = transactions.stream().filter(transaction -> transaction.getYear() == 2000).findFirst().orElse(transaction2);
  55. System.out.println(transaction3);
  56. }
  57. }
  1. [{pojo1.Trader:Brian in Cambridge, year: 2011, value:300}, {pojo1.Trader:Raoul in Cambridge, year: 2011, value:400}]
  2. [Cambridge, Milan]
  3. Alan, Brian, Raoul
  4. false
  5. 300
  6. 1000
  7. 400
  8. 950
  9. Optional[1000]
  10. 300
  11. {pojo1.Trader:Brian in Cambridge, year: 2011, value:300}

flatMap()

  1. package cn.eva.test.demo2;
  2. import java.util.List;
  3. class Course {
  4. String name;
  5. Course(String name) {
  6. this.name = name;
  7. }
  8. String getName() {
  9. return name;
  10. }
  11. }
  12. class Student {
  13. String name;
  14. List<Course> courses;
  15. Student(String name, List<Course> courses) {
  16. this.name = name;
  17. this.courses = courses;
  18. }
  19. List<Course> getCourses() {
  20. return courses;
  21. }
  22. String getName() {
  23. return name;
  24. }
  25. }
  26. class Class {
  27. String name;
  28. List<Student> students;
  29. Class(String name, List<Student> students) {
  30. this.name = name;
  31. this.students = students;
  32. }
  33. List<Student> getStudents() {
  34. return students;
  35. }
  36. }
  1. public static void main(String[] args) {
  2. List<Class> classes = Arrays.asList(
  3. new Class("Class A", Arrays.asList(
  4. new Student("Alice", Arrays.asList(new Course("Math"), new Course("Science"))),
  5. new Student("Bob", Arrays.asList(new Course("Math"), new Course("English")))
  6. )),
  7. new Class("Class B", Arrays.asList(
  8. new Student("Charlie", Arrays.asList(new Course("Science"), new Course("History"))),
  9. new Student("David", Arrays.asList(new Course("Math"), new Course("History")))
  10. ))
  11. );
  12. //获取所有班级的
  13. List<String> studentNames = classes.stream()
  14. .flatMap(cls -> cls.getStudents().stream()) // 将每个班级的学生展开成单独的流
  15. .map(Student::getName)
  16. .collect(Collectors.toList()); // 收集到一个列表中
  17. //获取所有课程信息
  18. List<String> courseNames = classes.stream()
  19. .flatMap(cls -> cls.getStudents().stream()) // 将每个班级的学生展开成单独的流
  20. .flatMap(student -> student.getCourses().stream()) // 将每个学生的课程展开成单独的流
  21. .map(Course::getName) // 获取每门课程的名称
  22. .collect(Collectors.toList()); // 收集到一个列表中
  23. studentNames.forEach(System.out::println);
  24. System.out.println("==============================================");
  25. courseNames.forEach(System.out::println);
  26. }

输出:

Alice
Bob
Charlie
David
==============================================
Math
Science
Math
English
Science
History
Math
History

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1006236
推荐阅读
相关标签
  

闽ICP备14008679号