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

问题描述 投票:1回答:3

我创建了一个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有用的典型场景是什么?

java java-8 java-stream consumer
3个回答
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(" "));

0
投票

使用Consumer永远不会像你期望的那样工作,因为String.toUpperCase()返回一个新的String实例。请看下面的例子:

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

你看,什么都没有回来。因此大写字符串将丢失/丢弃。

为了做你想做的事,你必须使用接受Function并返回StringString,例如:

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

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

Map<Key, String> map = ...;
map.entrySet().forEach(e -> {
    e.setValue(e.getKey(), toUpper.apply(e.getValue()));
}

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


0
投票

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

Function<String, String> upper = name -> name.toUpperCase();
names.stream().map(upper).collect(Collectors.joining(" "))
© www.soinside.com 2019 - 2024. All rights reserved.