Tag: java stream

在Stream :: flatMap中使用Java 8的Optional

新的Java 8stream框架和朋友提供了一些非常简洁的java代码,但是我遇到了一个看似简单的情况,这很难做到简洁。 考虑一个List<Thing> things和方法Optional<Other> resolve(Thing thing) 。 我想把这些Thing映射到Optional<Other> s并获得第一个Other 。 明显的解决scheme是使用things.stream().flatMap(this::resolve).findFirst() ,但flatMap需要你返回一个stream,而Optional没有stream()方法(或者它是Collection或提供方法将其转换为或Collection为一个Collection )。 我能想到的最好的是这样的: things.stream() .map(this::resolve) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); 但是,这似乎是一个非常普遍的情况,似乎非常啰嗦。 任何人有更好的主意?

分区Java 8stream

如何在Java 8 Stream上实现“分区”操作? 通过分区我的意思是,将一个stream划分成给定大小的子stream。 不知何故,它将与Guava Iterators.partition()方法相同,只是希望分区是懒惰评估的Streams而不是List。

收集到stream到一个新的集合

我正在寻找最无痛的方式来过滤一个集合。 我在想这样的事情 Collection<?> foo = existingCollection.stream().filter( … ). … 但我不确定从filter到返回或填充另一个集合的最佳方式。 大多数例子似乎是“在这里你可以打印”。 可能有一个构造函数,或输出方法,我错过了。

如何将Java 8stream转换为数组?

将Java 8 Stream转换为数组最简单/最简单的方法是什么?

在Javastream中偷窥真的只用于debugging?

我正在阅读关于Javastream和发现新的东西,因为我走。 我发现的新东西之一是peek()函数。 我几乎读过的所有东西都说它应该用来debugging你的Streams。 如果我有一个stream,其中每个帐户有一个用户名,密码字段和login()和loggedIn()方法。 我也有 Consumer<Account> login = account -> account.login(); 和 Predicate<Account> loggedIn = account -> account.loggedIn(); 为什么这么糟糕? List<Account> accounts; //assume it's been setup List<Account> loggedInAccount = accounts.stream() .peek(login) .filter(loggedIn) .collect(Collectors.toList()); 现在据我所知,这正是它打算做的。 它; 提供一个帐户清单 尝试login到每个帐户 过滤掉任何未login的帐户 将login帐户收集到新列表中 做这样的事情有什么缺点? 任何理由我不应该继续? 最后,如果不是这个解决scheme那么是什么? 这个原始版本使用.filter()方法如下; .filter(account -> { account.login(); return account.loggedIn(); })

为什么flatMap()之后的filter()在Javastream中“不完全”懒惰?

我有以下示例代码: System.out.println( "Result: " + Stream.of(1, 2, 3) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get() ); System.out.println("———–"); System.out.println( "Result: " + Stream.of(1, 2, 3) .flatMap(i -> Stream.of(i – 1, i, i + 1)) .flatMap(i -> Stream.of(i – 1, i, i + 1)) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get() ); 输出如下: […]

从stream中收集连续的对

给定诸如{ 0, 1, 2, 3, 4 } , 我怎样才能最优雅地将其转化为给定的forms: { new Pair(0, 1), new Pair(1, 2), new Pair(2, 3), new Pair(3, 4) } (当然,我已经定义了类对)? 编辑:这不是严格整数或原始stream。 答案应该是一般的任何types的stream。

我是否应该尽可能使用并行stream?

使用Java 8和lambdaexpression式,可以很容易地将集合作为stream进行迭代,并且使用并行stream也很容易。 来自docs的两个例子,第二个使用parallelStream的例子: myShapesCollection.stream() .filter(e -> e.getColor() == Color.RED) .forEach(e -> System.out.println(e.getName())); myShapesCollection.parallelStream() // <– This one uses parallel .filter(e -> e.getColor() == Color.RED) .forEach(e -> System.out.println(e.getName())); 只要我不关心顺序,使用并行总是有益的。 人们可能会认为将更多内核的工作划分得更快。 还有其他的考虑吗? 什么时候应该使用并行stream,何时应该使用非并行stream? (这个问题被要求引发关于如何和何时使用并行stream的讨论,不是因为我认为总是使用它们是一个好主意。)

Java 8列表<V>到地图<K,V>中

我想使用Java 8的stream和lambdaexpression式将对象列表转换成Map。 这是我将如何写在Java 7及以下。 private Map<String, Choice> nameMap(List<Choice> choices) { final Map<String, Choice> hashMap = new HashMap<>(); for (final Choice choice : choices) { hashMap.put(choice.getName(), choice); } return hashMap; } 我可以使用Java 8和Guava轻松完成,但我想知道如何在没有Guava的情况下执行此操作。 在番石榴: private Map<String, Choice> nameMap(List<Choice> choices) { return Maps.uniqueIndex(choices, new Function<Choice, String>() { @Override public String apply(final Choice input) { return input.getName(); } […]

有没有一个简洁的方式来迭代在Java 8中的索引stream?

有一个简洁的方式来迭代一个stream,同时访问stream中的索引? String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"}; List<String> nameList; Stream<Integer> indices = intRange(1, names.length).boxed(); nameList = zip(indices, stream(names), SimpleEntry::new) .filter(e -> e.getValue().length() <= e.getKey()) .map(Entry::getValue) .collect(toList()); 与那里给出的LINQ例子相比,这看起来相当令人失望 string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" }; var nameList = names.Where((c, index) => c.Length <= index + 1).ToList(); 有没有更简洁的方法? 此外,似乎拉链已经移动或被删除…