Tag: java 8

是否有一种优雅的方式来处理块中的流?

我的确切场景是批量插入数据库,所以我想累积DOM对象然后每1000个,刷新它们。 我通过将代码放入累加器来检测丰满度然后刷新来实现它,但这似乎是错误的 – 刷新控件应该来自调用者。 我可以将流转换为List然后以迭代方式使用subList,但这似乎也很笨拙。 它有一个简洁的方法来采取行动每n个元素然后继续流,而只处理流一次?

为什么我不能直接将方法引用分配给Object类型的变量?

关于java-8语法的简单问题。 为什么JLS-8限制这样的表达式: Object of_ref = Stream::of; // compile-time error 并允许只有这样的东西: java.util.function.Function of_ref = Stream::of; Object obj = of_ref; // compiles ok ?

如何在Java 8中并行读取文件的所有行

我想尽快将1 GB大文件的所有行读入Stream 。 目前我正在使用Files(path).lines() 。 在解析文件之后,我正在进行一些计算( map() / filter() )起初我认为这已经是并行完成了,但似乎我错了:当按原样读取文件时,它需要在我的双CPU笔记本电脑上50秒。 但是,如果我使用bash命令拆分文件然后并行处理它,它只需要大约30秒。 我尝试了以下组合: 单个文件,没有平行线()流~50秒 单个文件, Files(..).lines().parallel().[…] ~~ 50秒 两个文件,没有平行线()strean~30秒 两个文件, Files(..).lines().parallel().[…] ~~ 30秒 我用大致相同的结果(1或2秒)多次运行这4次。 […]只是一个地图和filter链,最后有一个toArray(…)来触发评估。 结论是使用lines().parallel()没有区别。 由于并行读取两个文件所需的时间较短,因此分割文件会带来性能提升。 然而,似乎整个文件是串行读取的。 编辑:我想指出我使用SSD,所以实际上是在寻找时间。 该文件总共有1658652(相对较短)的行。 在bash中拆分文件大约需要1.5秒: time split -l 829326 file # 829326 = 1658652 / 2 split -l 829326 file 0,14s user 1,41s system 16% cpu 9,560 total 所以我的问题是,Java 8 […]

在类中使用Optional作为属性是一个好习惯吗?

我在Java 8中读过一些关于Optional的目的(遗憾的是我不记得在哪里),我很惊讶作者没有提到在类中使用Optional作为属性。 由于我在课堂上经常使用选项,我想知道这是不是很好。 或者我可以更好地使用普通属性,当它们未设置时返回null ? 注意:看起来我的问题可能是基于意见的,但我觉得在课堂上使用Optional是不可取的(在阅读上述post后)。 但是,我喜欢使用它,并且找不到使用它的任何缺点。 例 我想举一个例子来澄清。 我有一个类Transaction ,它是这样构建的: public class Transaction { private Optional = Optional.empty(); …. VS public class Transaction { private Customer = null; …. 在检查Customer ,我认为使用transaction.getCustomer().isPresent()比使用transaction.getCustomer() != null更合乎逻辑。 在我看来,第一个代码比第二个代码更清晰。

流Java 8 api中是否有aggregateBy方法?

浏览Brian Goetz这篇非常有趣但却有一年历史的演示文稿 – 在幻灯片链接中他提出了一个假设在Stream API中的aggregateBy()方法,该方法应该将列表(?)的元素聚合到一个映射中(给定一个默认初始值和操纵值的方法(对于重复键也是如此) – 请参阅演示文稿中的下一张幻灯片)。 显然, Stream API中没有这样的方法。 还有另一种方法可以在Java 8中做类似的事情吗?

递归使用Stream.flatMap()

考虑以下课程: public class Order { private String id; private List orders = new ArrayList(); @Override public String toString() { return this.id; } // getters & setters } 注意:请务必注意,我无法修改此类 ,因为我正在使用外部API。 还要考虑以下订单层次结构: Order o1 = new Order(); o1.setId(“1”); Order o11 = new Order(); o11.setId(“1.1”); Order o111 = new Order(); o111.setId(“1.1.1”); List o11Children = new ArrayList(Arrays.asList(o111)); o11.setOrders(o11Children); Order […]

Collectors.summingInt()vs mapToInt()。sum()

如果要对流中的整数值求和,有两种主要方法: ToIntFunction mapFunc = … int sum = stream().collect(Collectors.summingInt(mapFunc)) int sum = stream().mapToInt(mapFunc).sum() 第一个涉及装箱返回的整数并将其拆箱,但第二个步骤涉及额外的步骤。 哪个更有效/更清晰?

‘Comparable 应该是’function界面’吗?

function接口的定义是“function接口是一个只有一个抽象方法的接口(除了Object的方法),因此代表了一个单一的function契约。” 根据这个定义,Comparable绝对是一个function界面。 lambda表达式的定义是“lambda表达式就像一个方法:它提供了一个forms参数列表和一个正文 – 一个表达式或块 – 用这些参数表示。” lambda表达式的评估产生function接口的实例。 因此,lambda表达式的目的是通过实现function接口的单个​​function来创建function接口的实例。 即。 允许使用单个函数创建实例。 让我们来看看Comparable,这个界面是否设计用作单一function? 即。 它是否仅用于创建具有此单一function的实例? Comparable的文档以“此接口对每个实现它的类的对象强加一个总排序。这个顺序称为类的自然顺序,类的compareTo方法被称为它的自然比较方法。” 上面的句子清楚地表明Comparable并不是设计用作单个函数,而是总是由一个类实现,它通过添加这个单个函数对其实例具有自然顺序。 这意味着它不是设计为使用lambda表达式创建的。 关键是我们不会有任何仅仅是可比较的对象,它意味着要实现,因此用作类的附加function。 那么,Java语言中是否有一种方法可以防止为Comparable创建lambda表达式? 接口的设计者是否可以决定这个接口是由一个类实现的,而不是通过使用lambda表达式作为这个单一方法的实例而被哄骗? 仅仅因为接口恰好具有单个抽象方法,所以不应将其视为function接口。 可能是,如果Java提供像NotFunctional这样的注释,编译器可以检查该接口是否不用于创建lambda表达式,例如。 @NotFunctional public interface Comparable { public int compareTo(T t); }

Java 8 Lambda – 两个列表的交集

我试图根据某些条件找到两个列表的intersection并执行一些步骤。 找不到办法(在学习阶段):) Double totalAmount = 0.00d; Double discount = 0.00d; List orderLineEntryList = orderEntry.getOrderReleases().stream() .flatMap(orderReleaseEntry -> orderReleaseEntry.getOrderLines().stream()) .filter(orderLineEntry -> orderLineEntry.getStatus().equals(“PP”) || orderLineEntry.getStatus().equals(“PD”)) .collect(Collectors.toList()); for (OrderLineEntry orderLineEntry : orderLineEntryList) { for (SplitLineEntry splitLineEntry : splitReleaseEntry.getLineEntries()) { if (splitLineEntry.getOrderLineId().equals(orderLineEntry.getId()) && splitLineEntry.getStatusCode() != “PX”) { totalAmount += orderLineEntry.getFinalAmount(); couponDiscount += orderLineEntry.getCouponDiscount() == null ? 0.00d : orderLineEntry.getCouponDiscount(); } […]

Java 8 LocalDate – 如何获取两个日期之间的所有日期?

是否可以在新的java.time API中获取两个日期之间的所有日期 ? 假设我有这部分代码: @Test public void testGenerateChartCalendarData() { LocalDate startDate = LocalDate.now(); LocalDate endDate = startDate.plusMonths(1); endDate = endDate.withDayOfMonth(endDate.lengthOfMonth()); } 现在我需要startDate和endDate之间的所有日期。 我想要获取两个日期之间的daysBetween并迭代: long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); for(int i = 0; i <= daysBetween; i++){ startDate.plusDays(i); //…do the stuff with the new date… } 有更好的方法来获取日期吗?