Tag: java stream

如何在流(java)中添加dateTime值?

今天我开始学习Java 8,所以我对Java 8很陌生。 我有一份活动清单。 活动具有name,startTime,endTime。 对于startTime和endTime,我正在使用joda时间的DateTime。 我正在尝试确定Map(String,DateTime)格式的数据结构,该格式为每个活动映射在监视期间计算的总持续时间。 这是我的代码片段: import java.util.ArrayList; import java.util.Map; import org.joda.time.DateTime; class Activity { public DateTime startTime; public DateTime endTime; public String activityLabel; public Activity(DateTime startTime, DateTime endTime, String activityLabel) { super(); this.startTime = startTime; this.endTime = endTime; this.activityLabel = activityLabel; } } public class Main { public static void main(String[] args) […]

如何在Java Stream中增加值?

我希望将每次迭代的index值增加1 。 很容易在for-loop 。 变量image是ImageView的数组。 这是我的for-loop 。 for (Map.Entry entry : map.entrySet()) { image[index].setImage(entry.getValue().getImage()); index++; } 为了练习Stream,我尝试将其重写为Stream : map.entrySet().stream() .forEach(e -> item[index++].setImage(e.getValue().getImage())); 导致我错误的原因: 错误:从lambda表达式引用的局部变量必须是final或者有效的final 如何重写Stream递增要使用的变量index ?

Java 8流将一个数组中的对象替换为另一个数组

我有两个对象数组。 如果对象符合某个条件,我想用第二个数组中的更新对象更新一个数组。 例如,我有这个: public class Foobar { private String name; // Other methods here… public String getName() { return this.name; } } Foobar [] original = new Foobar[8]; // Instantiate them here and set their field values Foobar [] updated = new Foobar[8]; // Instantiate them here and set their field values /* Use Java8 […]

在Java lambda中使用两个流来计算协方差

假设我有两个double数组。 我一直在尝试使用Java 8中的Stream。我想我已经理解了主要的想法,但后来我意识到我不确定如何同时操作两个Streams。 例如,我想计算两个数组的协方差。 public class foo { public static double mean(double[] xs) { return Arrays.stream(xs).average().getAsDouble(); } public static void main(String[] args) { double[] xs = {1, 2, 3, 4, 5, 6, 7, 8, 9}; double[] ys = {1517.93, 1757.78, 1981.1, 2215.73, 2942.66, 3558.32, 4063.91, 4521.16, 5101.76, 5234.12}; System.out.println(“Mean of xs: ” + mean(xs)); double […]

了解java 8 stream的过滤方法

我最近在Java 8中了解了Stream s并看到了这个例子: IntStream stream = IntStream.range(1, 20); 现在,让我们说我们想要找到第一个可分为3和5的数字。我们可能会filter两次并且findFirst如下: OptionalInt result = stream.filter(x -> x % 3 == 0) .filter(x -> x % 5 == 0) .findFirst(); 这听起来很合理。 当我尝试这样做时出现了令人惊讶的部分: OptionalInt result = stream.filter(x -> {System.out.println(x); return x % 3 == 0;}) .filter(x -> {System.out.println(x); return x % 5 == 0;}) .findFirst(); System.out.println(result.getAsInt()); 我希望得到类似的东西: 1 2 […]

为什么我的收集器方法不能并行处理数据?

但是,假设此缩减中使用的结果容器是可同时修改的集合 – 例如ConcurrentHashMap。 在这种情况下,累加器的并行调用实际上可以将它们的结果同时存入同一个共享结果容器中,从而消除了组合器合并不同结果容器的需要。 这可能会提升并行执行性能。 我们称之为同时减少。 也 支持并发缩减的收集器标有Collector.Characteristics.CONCURRENT特性。 但是,并发收集也有缺点。 如果多个线程同时将结果存入共享容器,则存储结果的顺序是不确定的。 来自该文件 这意味着与供应商(Concurrent-thread-safe)的collect方法应该有Collector.Characteristics.CONCURRENT 。 因此不应该维持任何秩序。 但是我的代码 List li=Arrays.asList(Employee.emparr()); System.out.println(“printing concurrent result “+li.stream().parallel().unordered().map(s->s.getName()).collect(() -> new ConcurrentLinkedQueue(), (c, e) -> c.add(e.toString()), (c1, c2) -> c1.addAll(c2)) .toString()); 始终以遇到的顺序打印结果。 这是否意味着我的Collector.Characteristics不是CONCURRENT ? 如何检查和设置这个特性?

为什么Stream操作与收集器重复?

请允许我提出一些投诉,也许这很有意思,但我想描述一下:“ 为什么要提出这个问题? ”。 我在这里回答的问题与其他问题不同,昨晚在这里和这里 。 在我深入研究之后,我发现Stream和Collector之间有许多重复的逻辑违反了不重复自己的原则,例如: Stream#map & Collectors#mapping , Stream#filter & Collectors#filtering in jdk-9 and。等等 但似乎合理,因为Stream遵守Tell,不要问 Demeter的原则/ 法则和collections家遵守inheritance原则的构成。 我只能想到为什么Stream操作与Collector s重复的几个原因如下: 我们不关心如何在大环境中创建Stream 。 在这种情况下, Stream操作比Collector更有效和更快,因为它可以简单地将Stream映射到另一个Stream ,例如: consuming(stream.map(…)); consuming(stream.collect(mapping(…,toList())).stream()); void consuming(Stream stream){…} 收集器function更强大,可以将收集器组合在一起收集流中的元素,但Stream只提供一些有用/高度使用的操作。 例如: stream.collect(groupingBy( …, mapping( …, collectingAndThen(reducing(…), …) ) )); 在执行一些更简单的工作时, 流操作比收集器更具表现力,但它们比收集器更慢,因为它将为每个操作创建新流,并且Stream比收集器更重和更抽象。 例如: stream.map(…).collect(collector); stream.collect(mapping(…, collector)); 收集器不能将短路终端操作应用为Stream 。 例如: stream.filter(…).findFirst(); 是否有人可以提出其他不利/优势,为什么Stream操作与收集器重复? 我想重新理解它们。 提前致谢。

了解Java 8和Java 9中的顺序流和并行流分裂器

关于劈开者的问题乍一看并不简单。 在流中, .parallel()更改流处理的行为。 但是我期望顺序和并行流创建的分裂器是相同的。 例如, 在顺序流中,通常不会调用.trySplit() ,而在并行流中,它是为了将拆分分裂器移交给另一个线程。 stream.parallel().spliterator()与stream.parallel().spliterator()之间的差异: 它们可能具有不同的特征: Stream.of(1L, 2L, 3L).limit(2); // ORDERED Stream.of(1L, 2L, 3L).limit(2).parallel(); // SUBSIZED, SIZED, ORDERED 这里讨论了另一个无意义的流分裂器特征策略(并行似乎更好地计算): 了解java 8和java 9中的深层分裂器特征 它们在使用.trySplit()分割方面可能有不同的行为: Stream.of(1L, 2L, 3L); // NON NULL Stream.of(1L, 2L, 3L).limit(2); // NULL Stream.of(1L, 2L, 3L).limit(2).parallel(); // NON NULL 为什么最后两个有不同的行为? 如果我愿意,为什么我不能拆分连续流? (例如,丢弃其中一个分割以进行快速处理可能很有用)。 将分裂器转换为流时的重大影响: spliterator = Stream.of(1L, 2L, 3L).limit(2).spliterator(); stream = StreamSupport.stream(spliterator, […]

分组对象java 8

我有类似下面的内容: public class MyClass { private Long stackId private Long questionId } 比如100的集合,其中stackid可以与不同的questionId重复。 它是stackId和questionId之间的一对多关系 是否有流畅的 ,java 8方式转换为下面的strcuture: public class MyOtherClass { private Long stackId private Collection questionIds } 这将是25的集合,每个实例具有4个questionIds的嵌套集合。 输入: [{1,100},{1,101},{1,102},{1,103},{2,200},{2,201},{2,202},{1,203}] 产量 [{1, [100,101,102,103]},{2,[200,201,202,203]}]

Java 8 – 填充ArrayList

有没有更好的方法来填充像这样的ArrayList (我在Java 7中这样做了): List scheduleIntervalContainers = new ArrayList(); scheduleIntervalContainers.add(scheduleIntervalContainer);