zoukankan      html  css  js  c++  java
  • java8中optional和.stream().map()

    使用optional的好处:是一个可以包含或不可以包含非空值的容器对象,更加友好的处理程序中的空对象

    Optional<T>有方法 isPresent() 和 get() 是用来检查其包含的对象是否为空或不是,然后返回它,如:

    Optional<SomeType> someValue = someMethod();

    if (someValue.isPresent()) { // check

        someValue.get().someOtherMethod(); // retrieve and call

    }

    下面这个案例涉及到Lambda表达式 方法引用,是将单词流中第一个以"L"开始单词取出,作为返回结果是一个Optional<String>。

    使用ifPresent()

      这个案例的代码如下:

    Stream<string> names = Stream.of("Lamurudu", "Okanbi", "Oduduwa");

    Optional<string> longest = names

                                    .filter(name -> name.startsWith("L"))

                                    .findFirst();

    longest.ifPresent(name -> {

                String s = name.toUpperCase();

                System.out.println("The longest name is "+ s);

            });

      这里ifPresent() 是将一个Lambda表达式作为输入,T值如果不为空将传入这个lambda。那么这个lambda将不为空的单词转为大写输出显示。在前面names单词流寻找结果中,有可能找不到开始字母为L的单词,返回为空,也可能找到不为空,这两种情况都传入lambda中,无需我们打开盒子自己编写代码来判断,它自动帮助我们完成了,无需人工干预。

    使用map()

      如果你想从Optional<T>中返回一个值怎么办?使用 map(),如下:

    Stream<string> names = Stream.of("Lamurudu", "Okanbi", "Oduduwa");

    Optional<string> longest = names

                                    .filter(name -> name.startsWith("L"))

                                    .findFirst();

    Optional<string> lNameInCaps = longest.map(String::toUpperCase);

      使用Optional<T>的map方法能够返回另外一个Optional,如上面的 LnameInCaps,因为传入map()的参数值也许会导致一个空值。

    使用orElse()

      如果在T可能空时你需要一个值的话,那么可以使用 orElse(),它能在T值存在的情况下返回这个值,否则返回输入值。

    Stream<String> names = Stream.of("Lamurudu", "Okanbi", "Oduduwa");

    Optional<String> longest = names

                                    .filter(name -> name.startsWith("Q"))

                                    .findFirst();

     String alternate = longest.orElse("Nimrod");

     System.out.println(alternate); //prints out "Nimrod"

    使用orElseGet()

      orElseGet() 方法类似于orElse(),但是不是直接返回输入参数,而是调用输入参数,返回调用的结果,这个输入参数通常是lambda:

    Stream<String> names = Stream.of("Lamurudu", "Okanbi", "Oduduwa");

    Optional<String> longest = names

                                    .filter(name -> name.startsWith("Q"))

                                    .findFirst();

     String alternate = longest.orElseGet(() -> {

                // perform some interesting code operation

                // then return the alternate value.

                return "Nimrod";

     });

     System.out.println(alternate);

    使用 orElseThrow()

      orElseThrow()是在当遭遇Null时,决定抛出哪个Exception时使用:

    Stream<String> names = Stream.of("Lamurudu", "Okanbi", "Oduduwa");

     Optional<String> longest = names

                                     .filter(name -> name.startsWith("Q"))

                                     .findFirst();

    longest.orElseThrow(NoSuchElementStartingWithQException::new);

    第二部分:

    在Java 8中stream().map(),您可以将对象转换为其他对象。查看以下示例:

    List<String> collect = alpha.stream().map(String::toUpperCase).collect(Collectors.toList());

    Collectors 实现了接口 Collector<T,A,R>
    T: 需要进行reduce操作的元素类型
    A:reduce操作的动态集合类型
    R:reduce操作的结果类型

    举例
    //将名字集合到list

    List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
    //将名字集合到TreeSet

    Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
    //将名字转换为String,并连接为一个字符串

    String joined = things.stream()
    .map(Object::toString)
    .collect(Collectors.joining(", "));
    //计算员工的工资总额

    int total = employees.stream()
    .collect(Collectors.summingInt(Employee::getSalary)));
    //根据部门将员工分组:

    Map<Department, List<Employee>> byDept
    = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment));
    //计算不同部门的员工工资总额

    Map<Department, Integer> totalByDept
    = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment,
    Collectors.summingInt(Employee::getSalary)));
    //划分及格和不及格的学生

    Map<Boolean, List<Student>> passingFailing =
    students.stream()
    .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

    Collectors的官方说明见:
    官网文档

    如果你对Function接口不是很了解,那么在使用这些方法时会很容易出错,下面进行简单的介绍:

    Function<T, R>

    T—函数的输入类型
    R-函数的输出类型

    也就是通过这个函数,可以将一个类型转换为另一个类型,比如下面的例子:

    //定义一个function 输入是String类型,输出是 EventInfo 类型, EventInfo是一个类。
    Function<String, EventInfo> times2 = fun -> { EventInfo a = new EventInfo(); a.setName(fun); return a;};

    String[] testintStrings={"1","2","3","4"};

    //将String 的Array转换成map,调用times2函数进行转换
    Map<String,EventInfo> eventmap1=Stream.of(testintStrings).collect(Collectors.toMap(inputvalue->inputvalue, inputvalue->times2.apply(inputvalue)));

    如果Collectors.toMap的转换过程很简单,比如输入和输出类型相同,则不需要另外定义Function,例如:

    Map<String,String> eventmap2=Stream.of(testStrings).collect(Collectors.toMap(inputvalue->inputval

  • 相关阅读:
    SQL server 语言基础
    存储过程练习
    触发器
    存储过程
    时间日期函数,类型转化,子查询,分页查询
    数学函数,字符串函数
    用 CREATE TABLE 命令建立表的结构
    结构体,枚举类型
    函数练习
    集合以及特殊集合
  • 原文地址:https://www.cnblogs.com/Pjson/p/10431470.html
Copyright © 2011-2022 走看看