如何使用Java中的地图应用Consumer?

时间:2018-02-28 01:24:10

标签: java java-8 java-stream consumer

我创建了一个Consumer,它接受一个字符串并将其设为大写。我正在尝试将其与地图一起实现,以使列表中的所有字符串都为大写。我知道这可以使用String::toUpperCase轻松完成,但我尝试与消费者一起使用,我收到以下错误

java: incompatible types: inferred type does not conform to upper bound(s)
    inferred: void
    upper bound(s): java.lang.Object

这是我的代码

Consumer<String> upper = name -> name.toUpperCase();
names.stream().map(name -> upper.accept(name)).collect(Collectors.joining(" "))

我想知道这是否是使用Consumer界面的正确方法,以及使用Consumer会有帮助的典型场景?

3 个答案:

答案 0 :(得分:0)

Consumer#accept不返回任何内容(void),因此无法编译,因为Stream#map接受Function<? super T, ? extends R>。您可以使用Consumer(这是一个特殊的UnaryOperator<String>)代替Function<T, T>

UnaryOperator<String> upper = String::toUpperCase;

names.stream()
     .map(upper)
     .collect(Collectors.joining(" "));

您甚至不需要将其存储在局部变量中,因为它可以内联:

names.stream()
     .map(String::toUpperCase)
     .collect(Collectors.joining(" "));

答案 1 :(得分:0)

使用Consumer将永远无法正常工作,因为String.toUpperCase()会返回String的新实例。请看以下示例:

Consumer<String> toUpper = s -> {
    s.toUpperCase();
};

你看到没有任何东西被归还。因此大写字符串将丢失/丢弃。

要做你想做的事,你必须使用接受Function并返回String的{​​{1}},例如:

String

然后您可以使用以下语句:

Function<String, String> toUpper = String::toUpperCase;

首先要获得你想要的东西。

答案 2 :(得分:0)

消费者永远不会为Stream地图操作工作。以Function作为参数的流映射操作。 您也可以使用以下代码执行此操作:

Function<String, String> upper = name -> name.toUpperCase();
names.stream().map(upper).collect(Collectors.joining(" "))