Tag: java stream

为什么.stream()。parallel()做同样的事情时,存在Collection.parallelStream()?

在Java 8中,Collection接口扩展了两个返回Stream<E> : stream()返回一个顺序stream, parallelStream()返回一个可能并行的stream。 stream本身也有一个parallel()方法返回一个等效的并行stream(或者将当前stream改变为并行或者创build一个新stream)。 重复有明显的缺点: 这很混乱。 一个问题询问是否需要调用parallelStream()。parallel()来确保该stream是并行的 ,因为parallelStream()可能会返回一个顺序stream。 为什么parallelStream()存在,如果它不能保证? 反过来也是令人困惑的 – 如果parallelStream()返回一个顺序stream,可能有一个原因(例如,一个固有的顺序数据结构,并行stream是一个性能陷阱)。 Stream.parallel()应该为这样的stream做什么? (UnsupportedOperationException不被parallel()的规范所允许。) 如果现有实现具有名称相似的方法,且返回types不兼容,则向接口添加方法可能会产生冲突。 除了stream()之外,还增加了parallelStream(),使得获得增益的风险加倍。 (请注意,parallelStream()是在一个刚刚命名为parallel(),虽然我不知道是否重命名,以避免名称冲突或其他原因。) 为什么在调用Collection.stream()时存在Collection.parallelStream()。parallel()做同样的事情?

Java 8列表与stream映射

我有一个List<Item>集合。 我需要将其转换为Map<Integer, Item>地图的关键字必须是集合中项目的索引。 我不知道如何做到这一点与stream。 就像是: items.stream().collect(Collectors.toMap(…)); 任何帮助? 由于这个问题被认为是可能的重复我需要补充一点,我的具体问题是 – 如何获得列表中的项目的位置,并把它作为一个关键的价值

为什么Stream.allMatch()对于空stream返回true?

我的同事和我有一个错误是由于我们的假设,一个空的stream调用allMatch()将返回false 。 if (myItems.allMatch(i -> i.isValid()) { //do something } 当然,假设和不读文档是我们的错。 但是我不明白为什么空stream的默认allMatch()行为返回true 。 这是什么原因? 和anyMatch() (相反地返回false)一样,这个操作是以一种命令的方式来使用的,它离开monad,可能用在if语句中。 考虑到这些事实,是否有任何理由为什么allMatch()默认为true空stream是可取的大多数用途?

我们应该如何pipe理空值的jdk8stream

各位Java开发人员, 由于JDK8还没有发布,所以我知道这个主题可能会in advance一点(现在也不是这样了),但是我正在阅读一些关于Lambdaexpression式的文章,特别是与被称为Stream的新集合API相关的部分。 下面是Java杂志文章 (它是一个水獭种群algorithm)给出的例子: Set<Otter> otters = getOtters(); System.out.println(otters.stream() .filter(o -> !o.isWild()) .map(o -> o.getKeeper()) .filter(k -> k.isFemale()) .into(new ArrayList<>()) .size()); 我的问题是,如果在Set内部迭代的中间发生了什么,其中一个otter是空的? 我会期望一个NullPointerException被抛出,但也许我仍然坚持以前的开发模式(非function),有人可以启发我如何处理? 如果这真的抛出一个NullPointerException,我觉得这个function相当危险,只能使用如下: 开发人员确保没有空值(可能使用以前的.filter(o – > o!= null)) 开发者确保应用程序永远不会生成null otter或一个特殊的NullOtter对象来处理。 什么是最好的select,或者其他select? 谢谢!

Java8stream顺序和并行执行产生不同的结果?

在Java8中运行以下stream示例: System.out.println(Stream .of("a", "b", "c", "d", "e", "f") .reduce("", (s1, s2) -> s1 + "/" + s2) ); 收益率: /a/b/c/d/e/f 当然,这并不奇怪。 由于http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.htmlstream是顺序执行还是并行执行都无关紧要: 除了标识为明确不确定的操作(如findAny())之外,顺序执行还是并行执行都不应改变计算结果。 AFAIK reduce()是确定性的,并且(s1, s2) -> s1 + "/" + s2是关联的,所以添加parallel()应该产生相同的结果: System.out.println(Stream .of("a", "b", "c", "d", "e", "f") .parallel() .reduce("", (s1, s2) -> s1 + "/" + s2) ); 但是我的机器上的结果是: /a//b//c//d//e//f 这里有什么问题? 顺便说一句:使用(首选的) .collect(Collectors.joining("/"))而不是reduce(…)产生相同的结果a/b/c/d/e/f […]

一种更好的方法来以function的方式处理exception

在Java 8中使用FP惯用语时,exception(尤其是被选中的exception)会严重中断程序逻辑的stream向。下面是一个任意的例子: String s1 = "oeu", s2 = "2"; Stream.of(s1, s2).forEach(s -> System.out.println(Optional.of(s).map(Integer::parseInt).get())); 上面的代码在不可parsing的string出现exception时中断。 但是说我只想用一个默认值replace它,就像我可以使用Optional : Stream.of(s1, s2).forEach(s -> System.out.println(Optional.of(s) .map(Integer::parseInt) .orElse(-1))); 当然,这仍然失败,因为Optional只处理null s。 我想要的东西如下: Stream.of(s1, s2).forEach(s -> System.out.println( Exceptional.of(s) .map(Integer::parseInt) .handle(NumberFormatException.class, swallow()) .orElse(-1))); 注意:这是一个自我回答的问题。

Java 8:使用换行符和缩进格式化lambda

我想用lambda缩进实现如下: 多线声明: String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" }; List<String> strings = Arrays.stream(ppl) .filter( (x) -> { return x.contains("(M)"); } ).collect(Collectors.toList()); strings.stream().forEach(System.out::println); 单行声明: List<String> strings = Arrays.stream(ppl) .map((x) -> x.toUpperCase()) .filter((x) -> x.contains("(M)")) .collect(Collectors.toList()); 目前,Eclipse正在自动格式化为以下内容: 多线声明: String[] ppl = new String[] { "Karen […]

Java 8 – 省去繁琐的收集方法

Java 8的streamAPI是非常好的function,我绝对喜欢它。 有一件事让我感到厌烦,那就是我有90%的时间想把收集和输出作为集合input。 结果是我必须始终调用stream()和collect()方法: collection.stream().filter(p->p.isCorrect()).collect(Collectors.toList()); 有没有任何Java API,可以让我跳过stream,直接操作集合(如C#中的linq ?): collection.filter(p->p.isCorrect)

什么时候应该使用stream?

当我使用一个List及其stream()方法时,我遇到了一个问题。 虽然我知道如何使用它们,但我不清楚何时使用它们。 例如,我有一个列表,其中包含到不同位置的各种path。 现在,我想检查一个给定的path是否包含列表中指定的任何path。 我想根据是否满足条件返回一个boolean 。 这当然不是一个艰巨的任务本身。 但是我想知道我应该使用stream还是for( – 每个)循环。 列表 private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{ "my/path/one", "my/path/two" }); 示例 – stream private boolean isExcluded(String path){ return EXCLUDE_PATHS.stream().map(String::toLowerCase).filter(path::contains).collect(Collectors.toList()).size() > 0; } 示例 – For-Each循环 private boolean isExcluded(String path){ for (String excludePath : EXCLUDE_PATHS) { if(path.contains(excludePath.toLowerCase())){ return true; } } return false; } […]

如何确保java8stream中的处理顺序?

我想处理XML java对象内的列表。 我必须确保处理所有元素,以便我收到它们。 因此,我应该在每个使用的stream上调用sequential吗? list.stream().sequential().filter().forEach() 或者只要不使用并行性就可以使用stream? list.stream().filter().forEach()