如何使用Java中的地图应用Consumer?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Java中的地图应用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有用的典型场景是什么?
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(" "));
使用Consumer
永远不会像你期望的那样工作,因为String.toUpperCase()
返回一个新的String
实例。请看下面的例子:
Consumer<String> toUpper = s -> {
s.toUpperCase();
};
你看,什么都没有回来。因此大写字符串将丢失/丢弃。
为了做你想做的事,你必须使用接受Function
并返回String
的String
,例如:
Function<String, String> toUpper = String::toUpperCase;
然后,您可以使用以下语句:
Map<Key, String> map = ...;
map.entrySet().forEach(e -> {
e.setValue(e.getKey(), toUpper.apply(e.getValue()));
}
首先要获得你想要的东西。
消费者永远不会为Stream地图操作工作。以Function作为参数的流映射操作。您也可以使用以下代码执行此操作:
Function<String, String> upper = name -> name.toUpperCase();
names.stream().map(upper).collect(Collectors.joining(" "))
以上是关于如何使用Java中的地图应用Consumer?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Spark Streaming Kafka Consumer 中的“java.io.NotSerializableException:org.apache.kafka.clients.con
如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?