可选字段流返回值

时间:2017-11-17 13:15:44

标签: java java-8 java-stream optional

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

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

我想返回包含所有值的List。如果例如可选&#34; name&#34;不存在,应该存储空字符串。方法的结果应该是List,其值为e.q:&#34; 1&#34;,&#34; John&#34;,&#34;&#34;,&#34; 5&#34;。

我做了流:

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

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

问候。

4 个答案:

答案 0 :(得分:8)

您可以使用:

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

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. 使用collect方法检索值

答案 3 :(得分:0)

这有效:

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