在谓词匹配时有条件地转换Stream元素

时间:2017-05-05 13:54:35

标签: java java-stream

我有一个流,只有在谓词匹配时才想应用方法。

E.g。我想处理一个流并用默认值替换所有null s。实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您应该只使用地图值

data.stream()
    .map(v -> v == null ? defaultValue : v)
    ... // do whatever you need to do with it.

修改

如果您需要做很多事情,可以创建一个函数来为您完成。

public class DefaultValue<T> extends Function<T, T> P{
    private final T t;
    public DefaultValue(T t){
        this.t. = t;
    }

    public T apply(T t) {
         return t == null ? this.t : t;
    }
 }

 data.stream()
     .map(new DefaultValue(someValue));
     // Do what you need to do

答案 1 :(得分:2)

如果您希望保留与过滤器匹配的项目的原始值,请使用带有三元逻辑的map

  • 未通过过滤器的项目按原样返回
  • 传递过滤器的项目已转换

以下是一个例子:

Stream<String> stream = Arrays.stream(
    new String[]{"quick", null, "brown", "fox", null, "jumps"}
);
List<String> res = stream
    .map(s -> s != null ? s : "<EMPTY>")
    .collect(Collectors.toList());
for (String s : res) {
    System.out.println(s);
}

过滤逻辑嵌入在map

中的条件表达式中
s -> s != null ? s : "<EMPTY>" // Using default values for null strings

Demo.