当前位置: 首页 > 知识库问答 >
问题:

使用lambda和streams表达代码块的简洁方法

闾丘德业
2023-03-14

嗨,我有一个代码块,它将一种窗口对象的列表转换为另一种,并将其填充到一个地图中,由ID键控。可能有许多具有相同id但具有不同名称和属性的对象实例。我所做的是做一个列表[W1(1,2,3),W1(2,3,4),W2(1,3,4)...]并将其转换为映射[键W1,值(1,2,3),(2,3,4)键W2,....]

    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(.....

共有1个答案

劳法
2023-03-14

例如,如果您有一个将从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)));
 类似资料:
  • 我在这里有一段代码,基本上只是创建一个等于参数的线程数,在每个线程中实例化一个MyRunnable对象,将线程添加到线程列表中,然后根据for循环的迭代设置线程的名称。 我的问题是,有没有更干净的方法?是否可以使用流将此功能封装在lambda中?

  • 我现在正在学习如何使用lambda表达式,我已经看到了一些带有简单示例的教程: 但是我的编译器显示这个错误: 我是不是忘了什么?

  • 问题内容: 假设我有一个通用接口: 和方法sort: 我可以调用此方法并将lambda表达式作为参数传递: 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: 然后像这样调用: 它不会编译。它在lambda表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各

  • 问题内容: 我正在尝试在以下调用中为“ keyMapper”函数参数提供更简洁的表达式: 看来我应该可以使用lambda表达式内联它,但是我无法提出一个可以编译的表达式。(我对lambda还是很陌生,所以这不足为奇。) 谢谢。 ->更新: 如已接受的答案中所述 是我一直在寻找的东西,也是我尝试过的东西。但是,问题是夜间构建的Eclipse 4.3的BETA_8是晚上出现的问题–它标记为错误。从命令

  • 问题内容: 我有以下代码: 当我通过main方法运行它时,它运行良好,但是当我尝试对其进行编译时,抛出以下错误: 我正在使用Eclipse IDE,并尝试通过命令行进行编译。 问题答案: 默认情况下,使用Java 5来编译类。引用其文档: 还要注意,当前的默认源设置是1.5,默认目标设置是1.5,与运行Maven的JDK无关。如果要更改这些默认值,则应按照设置Java编译器的- source和-t