【问题标题】:Succinct way to express a block of code using lambda and streams使用 lambda 和流表达代码块的简洁方法
【发布时间】:2018-08-30 21:12:42
【问题描述】:

您好,我有一段代码可以将一种窗口对象的列表转换为另一种类型的窗口对象,并将其填充到地图中,由 id 键入。可能有许多具有相同 id 但具有不同名称和属性的对象实例。我正在做的是获取一个列表 [W1(1,2,3), W1(2,3,4), W2(1,3,4)...] 并将其转换为 映射 [ 键 W1 ,值 (1,2,3), (2,3,4) 键 W2, .... ]

这里是代码 sn-p...

    List<LinWin> list = winDao.get.....

    Map<Long, List<MacWin>> res = new HashMap<>();
    for (LinWin mw : list) {

        List<MacWin> l2 = res.get(mw.getId());
        if (l2 == null) {
            l2 = new ArrayList<>();
            res.put(mw.getId(), l2);
        }
        l2.add(new MacWin(mw.getName(), mw.getVendor(), mw.isFixed()));
    }

返回资源

我想知道是否可以使用流和 lambdas 来折叠它。

list.stream().collect(Collectors.toMap(.....

【问题讨论】:

  • 除非你想并行化这个,你应该考虑不使用流。映射可以用一个非常紧凑的循环来表示。这可能会提高可读性。

标签: java lambda java-stream collectors


【解决方案1】:

如果你有一个方法可以从LinWin 转换为MacWin (或者将其设为静态或为MacWin 创建一个接受LinWin 作为输入的构造函数),这确实可以简化。 .我将在这里生成一个静态方法:

private static MacWin of(LinWin lw){
    return new MacWin(mw.getName(), mw.getVendor(), mw.isFixed());
}

以后的用法是(我在这里不使用流,因为在这种情况下不使用流,对我来说看起来更容易):

Map<Long, List<MacWin>> res = new HashMap<>();
mw.forEach(x -> res.computeIfAbsent(mw.getId(), y -> new ArrayList<>()).add(of(x)));

【讨论】:

  • 我认为collect/groupingBycomputeIfAbsent/add 更能表达你在做什么。
  • @DidierL 可能,即使我在发帖几天后有时也会改变主意......我猜今天是computeIfAbsent/add
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多