我被玩弄的Java 8 lambda表达式可以轻松过滤集合。 但我没有找到一个简洁的方式来检索结果作为同一语句中的新列表。 这是我最简洁的办法至今:
List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);
在网络上的例子,因为他们没有停止产生新的结果列表中没有回答我的问题。 必须有一个更简洁的方式。 我本来期望的是, Stream
类有方法为toList()
toSet()
,...
有没有一种方法,该变量targetLongList
可以直接由第三行分配的?
Answer 1:
你在做什么可能是最简单的方法,只要你保持流顺序,否则,你将不得不把调用顺序()之前forEach
。
[编辑后:原因调用顺序()是必要的是代码,因为它代表( forEach(targetLongList::add)
)将是活泼如果流是平行的。 即使这样,也不会达到预期的效果,作为forEach
是明确地不确定性,甚至在连续流元件处理的顺序不被保证。 你将不得不使用forEachOrdered
以确保正确的顺序。 在流API设计者的意图是,你将使用收集在这种情况下,如下图所示。]
另一种方法是
targetLongList = sourceLongList.stream()
.filter(l -> l > 100)
.collect(Collectors.toList());
Answer 2:
更新:
另一种方法是使用Collectors.toList
:
targetLongList =
sourceLongList.stream().
filter(l -> l > 100).
collect(Collectors.toList());
先前的解决方案:
另一种方法是使用Collectors.toCollection
:
targetLongList =
sourceLongList.stream().
filter(l -> l > 100).
collect(Collectors.toCollection(ArrayList::new));
Answer 3:
我喜欢用返回集电极用util的方法ArrayList
时候就是我想要的。
我想使用该解决方案Collectors.toCollection(ArrayList::new)
是这样一个共同的操作有点太嘈杂。
例:
ArrayList<Long> result = sourceLongList.stream()
.filter(l -> l > 100)
.collect(toArrayList());
public static <T> Collector<T, ?, ArrayList<T>> toArrayList() {
return Collectors.toCollection(ArrayList::new);
}
有了这个答案,我也希望证明它是多么简单的创建和使用自定义的收藏家,这是非常有用的一般。
Answer 4:
如果你有基元的数组,你可以使用现有的原始集合Eclipse的集合 。
LongList sourceLongList = LongLists.mutable.of(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
LongList targetLongList = sourceLongList.select(l -> l > 100);
如果你不能改变从sourceLongList List
:
List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList =
ListAdapter.adapt(sourceLongList).select(l -> l > 100, new ArrayList<>());
如果你想使用LongStream
:
long[] sourceLongs = new long[]{1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L};
LongList targetList =
LongStream.of(sourceLongs)
.filter(l -> l > 100)
.collect(LongArrayList::new, LongArrayList::add, LongArrayList::addAll);
注:我到Eclipse正宗的贡献。
Answer 5:
有一点更有效的方法(避免创建源列表和自动拆箱通过过滤器):
List<Long> targetLongList = LongStream.of(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L)
.filter(l -> l > 100)
.boxed()
.collect(Collectors.toList());
Answer 6:
collect(Collectors.toList());
这是你可以用它来转换任何流列出呼叫。
Answer 7:
如果你不介意使用第三方库,AOL的独眼巨人反应的 LIB(披露我是一个贡献者)对于所有扩展JDK集合类型,包括列表 。 所述LISTX界面延伸的java.util.List和添加了大量有用的运营商,包括过滤器的。
你可以简单地为写
ListX<Long> sourceLongList = ListX.of(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
ListX<Long> targetLongList = sourceLongList.filter(l -> l > 100);
LISTX也可以从现有的列表(通过ListX.fromIterable)被创建
Answer 8:
存在由LongStream类和类似地通过IntStream和DoubleStream类太提供收集方法的另一变型。
<R> R collect(Supplier<R> supplier,
ObjLongConsumer<R> accumulator,
BiConsumer<R,R> combiner)
执行有关此流的元素的可变归约运算。 一个可变的减少是其中所述减小的值是一个可变的结果容器,如一个ArrayList,和元素通过更新通过替换结果的结果,而不是状态并入。 这产生的结果等效于:
R result = supplier.get();
for (long element : this stream)
accumulator.accept(result, element);
return result;
像减少(长,LongBinaryOperator),收集操作可不需要额外的同步并行化。 这是一个终端的操作。
并回答与此收集方法您的问题如下:
LongStream.of(1L, 2L, 3L, 3L).filter(i -> i > 2)
.collect(ArrayList::new, (list, value) -> list.add(value)
, (list1, list2) -> list1.addAll(list2));
下面是该方法的参考变体是相当聪明,但有些什么猫腻就明白了:
LongStream.of(1L, 2L, 3L, 3L).filter(i -> i > 2)
.collect(ArrayList::new, List::add , List::addAll);
下面将是HashSet的变种:
LongStream.of(1L, 2L, 3L, 3).filter(i -> i > 2)
.collect(HashSet::new, HashSet::add, HashSet::addAll);
同样LinkedList的变化是这样的:
LongStream.of(1L, 2L, 3L, 3L)
.filter(i -> i > 2)
.collect(LinkedList::new, LinkedList::add, LinkedList::addAll);
Answer 9:
如果有人(比如我),在那里正在寻找办法对付的对象,而不是原始的类型,然后使用mapToObj()
String ss = "An alternative way is to insert the following VM option before "
+ "the -vmargs option in the Eclipse shortcut properties(edit the "
+ "field Target inside the Shortcut tab):";
List<Character> ll = ss
.chars()
.mapToObj(c -> new Character((char) c))
.collect(Collectors.toList());
System.out.println("List type: " + ll.getClass());
System.out.println("Elem type: " + ll.get(0).getClass());
ll.stream().limit(50).forEach(System.out::print);
打印:
List type: class java.util.ArrayList
Elem type: class java.lang.Character
An alternative way is to insert the following VM o
Answer 10:
String joined =
Stream.of(isRead?"read":"", isFlagged?"flagged":"", isActionRequired?"action":"", isHide?"hide":"")
.filter(s -> s != null && !s.isEmpty())
.collect(Collectors.joining(","));
Answer 11:
这里是代码由AbacusUtil
LongStream.of(1, 10, 50, 80, 100, 120, 133, 333).filter(e -> e > 100).toList();
披露:我AbacusUtil的开发商。
Answer 12:
如果你不使用parallel()
这将工作
List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<Long>();
sourceLongList.stream().peek(i->targetLongList.add(i)).collect(Collectors.toList());
文章来源: Retrieving a List from a java.util.stream.Stream in Java 8