如何转换流的类型?

时间:2017-05-03 10:31:23

标签: collections java-8 java-stream

除了之前提出的问题,可以在这里找到, 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类型以及如何纠正相同的问题。谢谢!

3 个答案:

答案 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);