我有一个具体的问题。有一些类似的问题,但这些问题要么是Python的问题,要么是Java的问题,或者需求是不同的,即使问题听起来很相似。
我有一张价值清单。
List1 = {10, -2, 23, 5, -11, 287, 5, -99}最后,我想根据他们的价值观来划分名单。我的意思是,如果值大于零,它将停留在原来的列表中,而在负值列表中相应的索引将被设置为零。如果值小于零,它将转到负值列表中,而原始列表中的负值将被替换为零。
由此产生的清单应该是这样的;
List1 = {10, 0, 23, 5, 0, 287, 5, 0}
List2 = {0, -2, 0, 0, -11, 0, 0, -99}有没有办法用Java中的Stream来解决这个问题?
发布于 2017-07-10 08:40:40
如果要在单个Stream操作中执行此操作,则需要一个自定义收集器:
List<Integer> list = Arrays.asList(10, -2, 23, 5, -11, 287, 5, -99);
List<List<Integer>> result = list.stream().collect(
() -> Arrays.asList(new ArrayList<>(), new ArrayList<>()),
(l,i) -> { l.get(0).add(Math.max(0, i)); l.get(1).add(Math.min(0, i)); },
(a,b) -> { a.get(0).addAll(b.get(0)); a.get(1).addAll(b.get(1)); });
System.out.println(result.get(0));
System.out.println(result.get(1));发布于 2018-09-24 14:29:42
Map<Boolean, List<Integer>> results=
List1.stream().collect(Collectors.partitioningBy( n -> n < 0));我认为这个更漂亮,更容易读懂。(然后,您可以从地图中得到否定和非否定的列表。)
发布于 2019-04-03 10:59:27
因为Java 12使用Collectors::teeing可以很简单地完成它
var divided = List.of(10, -2, 23, 5, -11, 287, 5, -99)
.stream()
.collect(Collectors.teeing(
Collectors.mapping(i -> Math.max(0, i), Collectors.toList()),
Collectors.mapping(i -> Math.min(0, i), Collectors.toList()),
List::of
));https://stackoverflow.com/questions/45006727
复制相似问题