除了之前提出的问题,可以在这里找到, How to combine list elements and find the price of largest combination
我没有使用Integer price
,而是使用String price
,
List<Long> highest = details
.stream()
.map(d -> Stream.concat(Stream.of(d.getDetailId()), d.getStackableDetails().stream()).collect(Collectors.toList()))
.collect(Collectors.toMap(s -> s.stream().map(Double.class::cast).reduce(0D,
(left, right) -> left + Double.parseDouble(map.get(right).getPrice())),
s -> s.stream().collect(Collectors.toList()),
(left, right) -> right,
TreeMap::new))
.lastEntry().getValue();
但是我在运行同样的时候继续获得类强制转换异常。有人能告诉我为什么我无法投射Stream类型以及如何纠正相同的问题。谢谢!
答案 0 :(得分:2)
你的问题很可能就在这里:
s -> s.stream().map(Double.class::cast)
您的detailId
类型为Long
;但是您正在尝试将其转换为Double
。
答案 1 :(得分:2)
我不太清楚你要做什么,但填充TreeMap
没有任何意义,只是为了得到最后一个元素。获取最大元素是作为内在Stream
操作提供的。
所以你在问题代码中所做的事情可以简化为
List<Long> highest = details
.stream()
.map(d -> Stream.concat(Stream.of(d.getDetailId()), d.getStackableDetails().stream())
.collect(Collectors.toList()))
.max(Comparator.comparingDouble(s -> s.stream()
.mapToDouble(l -> Double.parseDouble(map.get((double)l).getPrice()))
.sum()))
.get();
这也可以通过简单地将Long
转换为double
来解决您的问题。这会将Long
对象重新打包为long
值,执行向double
的扩展转换,并将其Double
设置为Map
查找。但是,建议不要将Double
个对象用作映射键。
答案 2 :(得分:1)
几乎my answer to your other question的副本:
double maxPrice = details.stream()
.mapToDouble(detail -> Stream.concat(Stream.of(detail.getDetailsId()),
detail.getStackableDetails().stream())
.flatMap(detailId -> details.stream()
.filter(candidateDetail -> detailId.equals(candidateDetail.getDetailsId())))
.map(Detail::getPrice)
// the applied transformation function of your String price to double:
.mapToDouble(Double::parseDouble)
.sum()
)
.max()
.orElse(0.0);