Tag: java stream

Collectors.joining(“,”)线程安全吗?

java.util.stream.Collectors::joining实现是否是线程安全的? 我能做点什么吗 public final class SomeClass { private static final Collector jc = Collectors.joining(“,”); public String someMethod(List someList) { return someList.parallelStream().collect(jc); } } 不用担心遇到并发问题?

Java 8 Stream – .max()带有重复项

所以我有一组对象,它们的步长变量可以是1到4。 public class MyClass { private Long step; //other variables, getters, setters, etc. } Collection myOjbects = /*get collection*/; 然后我想从具有最大步长值的集合中获取MyClass一个实例,所以我这样做: final Optional objectWithMaxStep = myObjects.stream().max(Comparator.comparing(MyClass::getStep)); 但是,在某些情况下,集合中将有多个MyClass实例,其步长等于4。 所以,我的问题是,如何确定在Optional返回哪个实例,或者当流中的多个对象具有要比较的最大值时是否抛出exception? max()函数的Java 8文档没有指定在这种情况下会发生什么。

在java流中使用多个映射函数与映射中的块语句

说我有以下代码 data.stream() .map(x -> { Object a = maybeReturnsNull(x); return a == null ? defaultValue : a; }) 我有一些函数可能返回null ,我将它应用于流的元素。 然后我想确保将任何null结果更改为某个默认值。 与使用上一个定义辅助变量a并在lambda表达式中使用代码块的示例相比,使用两个映射之间是否存在任何显着差异(如下例所示)? data.stream() .map(x -> maybeReturnsNull(x)) .map(x -> x == null ? defaultValue : x) 有没有标准在哪里或不避免使用lambda函数的块语句?

Java 8流连接并返回多个值

我正在将一段代码从.NET移植到Java,并偶然发现了我想使用流来映射和减少的情况。 class Content { private String propA, propB, propC; Content(String a, String b, String c) { propA = a; propB = b; propC = c; } public String getA() { return propA; } public String getB() { return propB; } public String getC() { return propC; } } List contentList = new ArrayList(); contentList.add(new Content(“A1”, […]

使用流,如何在HashMap中映射值?

给定一个Map ,其中Person上有一个String getName() (etc)方法,如何将Map转换为Map ,其中String是从调用Person::getName() ? 我会使用Pre-Java 8 Map byNameMap = new HashMap(); for (Map.Entry person : people.entrySet()) { byNameMap.put(person.getKey(), person.getValue().getName()); } 但我想用流和lambdas来做。 我无法看到如何以function样式执行此操作:Map / HashMap不实现Stream 。 people.entrySet()返回一个Set<Entry>我可以流过,但是如何将新的Entry到目标映射?

按日期对项目进行分组

我的列表中有项目,项目有一个字段,显示项目的创建日期。 我需要根据用户提供的“压缩”对它们进行分组。 选项包括Day , Week , Month和Year 。 如果用户选择day压缩,我需要将我的项目分组,以便在同一天创建的项目将被分组。 在上面的示例中,仅在同一天创建了第1项和第2项。 其他人也是团体,但他们只有一个项目,因为在他们的日子,只创建了一个项目。 {{item1, item2}, {item3}, {item4}, {item5}, {item6}, {item7}} 如果用户选择week : {{item1, item2, item3, item4}, {item5}, {item6}, {item7}} 如果用户选择month : {{item1, item2, item3, item4, item5}, {item6}, {item7}} 如果用户选择year : {{item1, item2, item3, item4, item5, item6}, {item7}} 创建组后,项目的日期并不重要。 我的意思是,只要创建了组,密钥就可以是任何东西。 如果使用Map ,我认为按键如下: day =一年中的day一天 week =一年中的一周 month =一年中的月份 […]

从Java 8流中获取下一个项目

我想从Java 8 Stream检索并删除下一个项目,而不会关闭此Stream 。 Stream integerStream = Stream.iterate( 0, x -> new Integer(x + 1) ); Integer zero = integerStream.getNext(); // 0 Integer one = integerStream.getNext(); // 1 … 这可能吗?

根据独立谓词流式传输集合并收集到多个结果

我正在盯着一些命令式的代码,我试图将其转换为纯粹的function性风格。 基本上在inputSet有一个迭代for循环,我在其中检查3个谓词并根据哪个谓词匹配填充3个outputSets 。 输出集可以重叠。 如何使用Java 8流/ map / filter /等以纯函数方式执行此操作?

Java 8流中的arg max?

我经常需要根据产生double或int值的标准的最大化来收集集合的最大元素。 Streams有max()函数,需要我实现一个比较器,我觉得很麻烦。 是否有更简洁的语法,例如以下示例中的names.stream().argmax(String::length) ? import java.util.Arrays; import java.util.Comparator; import java.util.List; public class ArgMax { public static void main(String[] args) { List names = Arrays.asList(“John”,”Joe”,”Marilyn”); String longestName = names.stream().max((String s,String t)->(Integer.compare(s.length(),t.length()))).get(); System.out.println(longestName); } }

如果使用自定义Comparator创建,则为SortedMap生成的流的流特征可能不会被分类

由Maurice Naftalin掌握Lambdas,第6章 – 流表演。 有关不同执行阶段(中间和终端)的流的不同特征的解释。 例如。 Stream.of(8,3,5,6,7,4)//ORDERED, SIZED .filer(i->i%2==0) // ORDERED .sorted() // ORDERED, SORTED .distinct() // DISTINCT, ORDERED, SORTED .map(i->i+1) // ORDERED .unordered(); //none 令我困惑的是对SORTED特征的解释: “如果比较器已被定义并用于此目的,则流元素可能已按其他顺序排序,但此类流不具有SORTED特征。” 为什么如果提供自定义比较器来实现排序数据结构(在上面的情况下为SortedMap),框架将不考虑创建具有SORTED特性的流?