【问题标题】:Create List of Employees with dynamic values using Java streams使用 Java 流创建具有动态值的员工列表
【发布时间】:2020-04-24 15:35:13
【问题描述】:

我有一个用例,我必须创建具有递增 id 的默认员工列表,

List<Employee> employeeList = new ArrayList<>();
int count = 0;
while (count++ <= 100){
    Employee employee = new Employee(count, "a"+count);
    employeeList.add(employee);
}

我没有任何可以使用流的集合。我们可以用函数式的方式来做吗?

【问题讨论】:

  • Stream.iterate(0, n -&gt; n + 1).limit(100).map(i -&gt; new Employee(i, "a" + i)).collect(Collectors.toList())

标签: java functional-programming java-stream


【解决方案1】:

您可以使用IntStreamrangeClosed(int startInclusive, int endInclusive) 来生成计数

List<Employee> employeeList = IntStream.rangeClosed(0,100)
                                       .boxed()
                                       .map(count-> new Employee(count, "a"+count))
                                       .collect(Collectors.toList());

或者你可以使用Stream.iterate

List<Employee> employeeList = Stream.iterate(0, n -> n + 1)
                                    .limit(100)
                                    .map(i -> new Employee(i, "a" + i))
                                    .collect(Collectors.toList())

【讨论】:

  • 天啊,感谢上帝的反对,有机会解释为什么吗?
  • 刚刚遇到这个。这不是我,但可能是因为您使用 mapToObj 创建状态,根据我在本网站讨论中所读到的内容,这是对该方法的滥用。我相信我是在 Meta 上读到的
  • 我会试着找到它,因为我现在也很好奇。
  • 我认为我在流操作中创建实例是错误的。如果您在流操作中改变现有状态,可能会导致并行操作出现问题。但是通过仅仅创建一个实例,你并没有改变状态,因为新实例不会修改旧实例。所以我认为你正在做的事情是完全可以接受的。所以我不知道你为什么被否决(这开始了这个讨论)。所以我改善了情况+1。
  • 我只能说和 WJS 一样,不清楚为什么这个答案被否决了。使用mapToObj 的原始版本很好。我认为,原因是非技术性的。这个问题也被否决了,所以也许有人认为这是一个糟糕的问题,根本不应该得到答案。有这样的人在思考时会否决所有答案。另一方面,我没有看到接近的选票。所以最后,我们不知道也不应该浪费太多时间考虑这些投票......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多