我不能编译下面的代码(尝试
onlinegdb
List<Container<Dto>> list = Arrays.asList(
new Container<>(new Dto("A"), 10L),
new Container<>(new Dto("A"), 30L),
new Container<>(new Dto("B"), 30L));
Map<String, Optional<Long>> mapWrong = list.stream()
.collect(Collectors.groupingBy(
c -> c.getOutput().getType(),
Collectors.mapping(
Container::getDifference,
Collectors.maxBy(Comparator.naturalOrder())))); // DOESN'T WORK WITH THIS
不兼容类型:无法推断类型变量T,U,A,R,capture#2 of?,T,T
找到:java.lang.Object
Collectors.mapping
将对象映射到新值
Container::getDifference
退货
long
同样的类型应该被推断出来
Collectors.maxBy
令人惊讶的是,当我替换
Comparator.naturalOrder()
具有
Comparator.comparingLong(l -> l)
,那么它就起作用了。
Map<String, Optional<Long>> mapCorrect = list.stream()
.collect(Collectors.groupingBy(
c -> c.getOutput().getType(),
Collectors.mapping(
Container::getDifference,
Collectors.maxBy(Comparator.comparingLong(l -> l))))); // A CHANGE TO FIX IT
public class Container<T> {
T output;
long difference;
}
public class Dto {
String type;
}
注意这是可重复使用OpenJDK和
jdk-11.0.5
和
jdk1.8.0_212