【问题标题】:Stream of optional fields return values可选字段流返回值
【发布时间】:2018-05-01 06:47:27
【问题描述】:

我有几个可选字段,带有 String 和 Long 值:

Optional<Long> id;
Optional<String> name;
Optional<String> lastname;
Optional<Long> number;
....

我想返回包含所有值的列表。如果例如可选的“名称”不存在,则应存储空字符串。方法的结果应该是具有值 e.q 的列表:“1”、“John”、“”、“5”。

我制作了流:

Stream fields = Stream.of(id, name, lastname, number);

但我不知道接下来会发生什么。

问候。

【问题讨论】:

  • 我想返回包含所有值的 List。如果例如可选的“名称”不存在,则应存储空字符串。方法的结果应该是具有值 e.q 的列表:“1”、“John”、“”、“5”。
  • 您应该使用此附加信息编辑您的问题。
  • 这就是不鼓励使用Optional 字段的原因。为什么不将所有字段声明为纯 String 并首先使用空字符串对其进行初始化?

标签: java java-8 java-stream optional


【解决方案1】:
List<String> ls = Stream.of(a, b).filter(o -> o != null && !o.trim().equals("")).map(o -> o instanceof Long ? String.valueOf(o) : o).collect(Collectors.toList()); 
  1. 创建流
  2. 添加一个过滤器,如果满足两个条件,则保留值:它们不为空,如果为真,则字符串值不为空(trim() 方法允许删除左侧的空字符和值的右边)
  3. 使用 map 方法将 Long 实例的对象转换为 String 实例
  4. 使用收集方法来检索值

【讨论】:

  • @TobySpeight 我做到了。
【解决方案2】:

你可以使用:

List<String> list = Stream.of(id, name, lastname, number)
        .map(op -> op.map(o -> o.toString()).orElse(""))
        .collect(Collectors.toList());

在每个可选的流中,您将使用来自Object 类的toString() 将其映射到它的String 版本,对于null,您将其映射到空的String。然后,您会将其收集到列表中。

【讨论】:

    【解决方案3】:

    这行得通:

    List<String> result = fields.map(o -> o.orElse(""))  // provide default value
                                .map(o -> o.toString())  // cast to String
                                .collect(Collectors.toList()); // collect into List
    

    See it in action.

    【讨论】:

    • 只有当你有Optional 没有类型时它才有效。在问题中,我们看到他的选项是参数化的。
    • @ByeBye 似乎可以很好地处理参数化选项,除非我错过了什么;请检查我更新的ideone。
    • @ByeBye 只要Stream 是未参数化OptionalStream(接受任何Optional&lt;T&gt;),第一张地图就会从未参数化Optional 转换为Object(其中包括String),然后第二次从Object 转换为String
    • 这是有道理的,但是为此您必须使用流提取变量。
    • @ByeBye 是的,这是 OP 的上下文 ;)
    【解决方案4】:

    您可以使用流的map 方法来操作流的内容,类似于以下代码:

    fields.map(field -> field.orElse("").toString());
    

    可选的还有一个map方法,可以在操作流时使用:

    fields.map(field -> field.map(x -> x.toString()).orElse(""));
    

    【讨论】:

    • 是的,它会的,唯一需要的改变是将参数放在Stream中,使其成为Stream&lt;Optional&gt; fields ...
    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多