我创建了一个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会有帮助的典型场景?
答案 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(" "))