[Collections] 从Java中的java.util.stream.Stream获取列表8


Answers

另一种方法是使用Collectors.toCollection

targetLongList = 
    sourceLongList.stream().
    filter(l -> l > 100).
    collect(Collectors.toCollection(ArrayList::new));
Question

我正在玩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直接由第三行赋值?




更有效的方法(避免创建源列表和自动拆箱):

List<Long> targetLongList = LongStream.of(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L)
    .filter(l -> l > 100)
    .boxed()
    .collect(Collectors.toList());



String joined = 
                Stream.of(isRead?"read":"", isFlagged?"flagged":"", isActionRequired?"action":"", isHide?"hide":"")
                      .filter(s -> s != null && !s.isEmpty())
                      .collect(Collectors.joining(","));



如果有人(像我)在寻找方式处理对象而不是原始类型,那么使用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



如果您不介意使用第三方库,AOL的cyclops-react库(披露我是贡献者)具有对所有JDK集合类型(包括List )的扩展。 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)






Links