Tag: java 8

为什么Files.list()并行流的执行速度比使用Collection.parallelStream()慢得多?

以下代码片段是获取目录列表的方法的一部分,在每个文件上调用extract方法并将生成的药物对象序列化为xml。 try(Stream paths = Files.list(infoDir)) { paths .parallel() .map(this::extract) .forEachOrdered(drug -> { try { marshaller.write(drug); } catch (JAXBException ex) { ex.printStackTrace(); } }); } 这是完全相同的完全相同的代码,但使用普通的.list()调用来获取目录列表并在结果列表中调用.parallelStream() 。 Arrays.asList(infoDir.toFile().list()) .parallelStream() .map(f -> infoDir.resolve(f)) .map(this::extract) .forEachOrdered(drug -> { try { marshaller.write(drug); } catch (JAXBException ex) { ex.printStackTrace(); } }); 我的机器是四核MacBook Pro,Java v 1.8.0_60(内置1.8.0_60-b27)。 我正在处理~7000个文件。 平均3次运行: 第一个版本:使用.parallel() :20秒。 没有.parallel() […]

超类方法和接口默认方法冲突解决

考虑下面的例子, public class Testing extends SupCls implements Intf { public static void main(String[] args) { new Testing().test(); } } class SupCls { public void test() { System.out.println(“From SupCls”); } } interface Intf { public default void test() { System.out.println(“From Intf”); } } 如您所见, SupCls类和Intf接口之间没有任何关联。 但两者都定义了一种常用方法。 而Testing类正在扩展SupCls并实现Intf 。 所以,当我在Testing输出上调用test()方法时, From SupCls 我认为这是有道理的,因为从类扩展应该比从接口实现更高的优先级。 但是eclipse报告不然,如下面的屏幕截图所示。 我坚信这是Eclipse中的一个错误 。 但在假设之前,是否在JLS中定义并记录了此行为? […]

Java 8时区转换

在Java 8中,我想将日期时间从UTC转换为ACST(UTC + 9:30)。 输入 – > 2014-09-14T17:00:00 + 00:00 output-> 2014-09-15 02:30:00 String isoDateTime = “2014-09-14T17:00:00+00:00”; LocalDateTime fromIsoDate = LocalDateTime.parse(isoDateTime, DateTimeFormatter.ISO_OFFSET_DATE_TIME); ZoneOffset offset = ZoneOffset.of(“+09:30”); OffsetDateTime acst = OffsetDateTime.of(fromIsoDate, offset); System.out.println(acst.toString()); // 2014-09-14T17:00+09:30 System.out.println(acst.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); // 2014-09-14T17:00:00+09:30 为什么没有执行偏移?

将选项卡添加到选项卡和选项卡区域JavaFX

我正在寻找一种方法来添加一个Button到JavaFX Tab 。 搜索互联网,但我找不到任何解决方案。 类似于下面屏幕截图中的按钮。 有人可以帮我吗?

REST服务中的Java 8 Lambda表达式无法正常工作

如果我将一个Java 8 Lambda表达式放在REST服务中,它就会崩溃。 如果我删除lambda表达式,它的工作原理。 如果我使用lambda表达式并不重要。 只是存在lambda足以崩溃。 Java 8相关的所有其他内容似乎都有效。 以下是我的代码(简化): @Path(“finance”) public class FinanceRest { @GET @Produces(“text/plain”) public String speak() { return “Hello world.”; } private void lambdaFunction(Predicate predicate) { // Any lambda will cause problems, no matter how simple List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Stream onlyOdds = numbers.stream().filter(n […]

java 8 – 流,地图和计数不同

我第一次尝试java 8流… 我有一个对象Bid,它代表用户对拍卖中商品的出价。 我有一个出价列表,我想制作一张地图,其中包含用户出价的拍卖数量(不同)。 这是我的看法: bids.stream() .collect( Collectors.groupingBy( bid -> Bid::getBidderUserId, mapping(Bid::getAuctionId, Collectors.toSet()) ) ).entrySet().stream().collect(Collectors.toMap( e-> e.getKey(),e -> e.getValue().size()) ); 它工作,但我觉得我在作弊,因为我流式传输地图的入口集,而不是在初始流上做一个操作…必须是一个更正确的方式这样做,但我无法想象出来… 谢谢

为什么lambda强迫我使用单个元素数组而不是最终对象?

我有以下课程: public class Item{ private String name; //setter getter } 和物品的集合。 我想得到Collection中最后一项的名字。 要做到这一点,我只需迭代所有集合并使用最后。 问题是我不知道为什么它迫使我使用一个元素String数组。 为什么我必须使用: String[] lastName = {“”}; items.forEach(item -> lastName[0] = item.getName()); System.out.println(lastname[0]); 代替: final String lastName; items.forEach(item -> lastName = item.getName()); System.out.println(lastname);

JSR-310中两个不同的基于周的年度定义的动机是什么?

这些是java.time.temporal包中的两个字段: IsoFields.WEEK_BASED_YEAR WeekFields.ISO.weekBasedYear() ISO-8601定义了除其他两种日期之外的所谓周日期,即通常的日历日期(包括年,月和日)和顺序日期(包括年和年) )。 星期日的格式为YYYY-‘W’ww-e 。 w代表一周的年份,e代表数字ISO-星期几。 Y代表以周为基础的年份,与日历年相同,但在日历年的开始或结束时除外,因为基于周的年份与最终可能在上一年开始的周周期相关。 有两条规则对于理解星期日的形成非常重要: 周总是从周一开始。 日历年的第一周是包含至少四天的一周。 乍一看,两个JSR-310字段看起来都是相同的,因为ISO-8601只提到了一种基于周的年份。 但是,等一下,惊喜。 让我们考虑以下代码示例: LocalDate date1 = LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014); System.out.println(“IsoFields-Test: ” + date1); // output: 2014-03-01 LocalDate date2 = LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014); System.out.println(“WeekFields-Test: ” + date2); // output: 2014-02-25 虽然我非常了解第二种变化,但我真的很惊讶看到第一次约会的不同结果是在其类名中使用“官方”ISO-8601引用。 要解释计算结果: 2000-02-29日期对应于ISO-weekdate-notation的2000-W09-2,而2014-02-25对应于2014-W09-2, 保留了一周中的星期和星期几 。 到目前为止很好。 较小字段的这种保留特性类似于如何更改日历年的规则(在大多数情况下应该保持日历日期中的月份和日期不变)。 但结果2014-03-01是什么? 这里算法简单地将相应的周日添加了四天,以便考虑“日期”字段(29对25)的差异。 我没有找到任何关于此行为的来源或官方文档。 有谁知道我们在哪里可以找到这两个领域之间差异的理由? 有关算法行为的任何文档? […]

为什么Java 8中的function接口有一个抽象方法?

正如我们在Java 8中所知,引入了function接口的概念。 function接口有一个abstract方法,可以使用多种默认或静态方法。 但为什么Functional接口只有一个抽象方法呢? 如果Interface有多个抽象方法,为什么这不是一个function接口?

嵌套的Java 8并行forEach循环表现不佳。 这种行为有望吗?

注意:我已经在另一个SOpost中解决了这个问题 – 在嵌套的Java 8并行流动作中使用信号量可能是DEADLOCK。 这是一个错误吗? – 但是这篇文章的标题表明问题与使用信号量有关 – 这有点分散了讨论的注意力。 我正在创建这个,以强调嵌套循环可能有性能问题 – 虽然这两个问题可能是一个共同的原因(也许是因为我花了很多时间来弄清楚这个问题)。 (我不认为它是重复的,因为它强调另一种症状 – 但如果你只是删除它)。 问题:如果你嵌套两个Java 8 stream.parallel()。forEach循环并且所有任务都是独立的,无状态的等等 – 除了被提交到公共FJ池 – 然后在并行循环内嵌套并行循环执行得更差而不是在并行循环内嵌套顺序循环。 更糟糕的是:如果同步包含内循环的操作,您将获得DEADLOCK。 演示性能问题 如果没有“同步”,您仍然可以观察到性能问题。 您可以在以下url找到演示代码: http : //svn.finmath.net/finmath%20experiments/trunk/src/net/finmath/experiments/concurrency/NestedParallelForEachTest.java (有关更详细的说明,请参阅JavaDoc)。 我们的设置如下:我们有一个嵌套的stream.parallel()。forEach()。 内环是独立的(无状态,无干扰等 – 除了使用公共池之外)并且在最坏的情况下总共消耗1秒,即如果是顺序处理的话。 外循环的一半任务在该循环之前消耗10秒。 在该循环之后,一半消耗10秒。 因此,每个线程总共消耗11秒(最坏情况)。 *我们有一个布尔值,允许将内部循环从parallel()切换到sequential()。 现在:将24个外循环任务提交到具有并行性的池8我们预计24/8 * 11 =最多33秒(在8核或更好的机器上)。 结果是: 内部顺序循环:33秒。 内部并行循环:> 80秒(我有92秒)。 问题:你能证实这种行为吗? 这是人们对框架的期望吗? (我现在更加小心,声称这是一个错误,但我个人认为这是由于ForkJoinTask的实现中的一个错误。备注:我已将此发布到并发兴趣(请参阅http:// cs.oswego.edu/pipermail/concurrency-interest/2014-May/012652.html ),但到目前为止我没有得到确认)。 certificate了僵局 以下代码将为DEADLOCK // Outer […]