如何使用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并返回StringString,例如:

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

如何随意显示地图?

如何使用我的 ios 应用程序中的路线打开苹果地图应用程序

如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?

Android:如何使用谷歌地图在我的应用中显示用户当前位置?

如何在 Python 中的 Spark Dataframe 上应用任何类型的地图转换