Tag: java 8

Java 8:计算两个ZonedDateTime之间的差异

我正在尝试编写一种方法来打印两个ZonedDateTime之间的时差 ,关于时区之间的差异。 我找到了一些解决方案,但所有这些解决方案都是用LocalDateTime编写的。

在Java 8中用流替换嵌套for循环的正确方法是什么?

在学习Java 8流和lambas时,我尝试用流替换以下嵌套for循环: List deskIds = new ArrayList(); for(ProvidedService memberService : service.getAllNodesDepthFirst()){ for(Desk d : memberService.getDesks()){ deskIds.add(d.getId()); } } 循环迭代一个’ProvidedService’对象列表,并为每个对象迭代’Desk’对象的list属性,并将’Id’字段提取到列表中。 我使用流来提出以下代码: List deskIds = new ArrayList(); service.getAllNodesDepthFirst().stream().forEach(srv -> { deskIds.addAll(srv.getDesks().stream().map(Desk::getId).collect(Collectors.toList())); }); 这是正确/最佳的方式吗? 或者有没有办法在没有第二个嵌套流的情况下执行此操作?

递归流

我想使用Java 8以递归方式列出计算机上的所有文件。 Java 8提供了一个listFiles方法,该方法返回所有文件和目录,但没有递归。 如何使用它来获取完整的递归文件列表(不使用变异集合)? 我已经尝试了下面的代码,但它只有一个深度: static Function<Path, Stream> listFiles = p -> { if (p.toFile().isDirectory()) { try { return Files.list(p); } catch (Exception e) { return Stream.empty(); } } else { return Stream.of(p); } }; public static void main(String[] args) throws IOException { Path root = Paths.get(“C:/temp/”); Files.list(root).flatMap(listFiles).forEach(System.out::println); } 并使用return Files.list(p).flatMap(listFiles); 不编译(不确定原因)…… 注意:我对涉及FileVisitors或外部库的解决方案不感兴趣。

同步局部变量

我注意到ConcurrentHashMap的compute和computeIfAbsent方法中有一个奇怪的构造: Node r = new ReservationNode(); synchronized (r) { //… } 考虑到JIT最有可能将其视为无操作,本地对象同步的重点是什么?

错过了在Java 8中修复JDBC日期处理的机会?

任何Java 8 + JDBC专家都能告诉我以下推理是否有问题吗? 而且,如果在众神的秘密中,为什么没有这样做呢? java.sql.Date当前是JDBC用于映射到DATE SQL类型的类型,它表示没有时间且没有时区的日期。 但是这个类设计得非常好,因为它实际上是java.util.Date的子类,它可以存储精确的瞬间,最长可达毫秒。 为了在数据库中表示日期2015-09-13,我们因此被迫选择一个时区,在该时区中将字符串“2015-09-13T00:00:00.000”解析为java.util.Date以获得毫秒value,然后从这个毫秒值构造一个java.sql.Date ,最后在预准备语句上调用setDate() ,传递一个包含所选时区的Calendar,以便JDBC驱动程序能够正确地重新计算日期2015-09 -13来自这个毫秒值。 通过在任何地方使用默认时区,而不是传递日历,可以使此过程更简单一些。 Java 8引入了一个LocalDate类,它更适合DATE数据库类型,因为它不是精确的时刻,因此不依赖于时区。 Java 8还引入了默认方法,这些方法允许对PreparedStatement和ResultSet接口进行向后兼容的更改。 那么,我们还没有错过一个清理JDBC中的混乱而仍然保持向后兼容性的巨大机会吗? Java 8可以简单地将这些默认方法添加到PreparedStatement和ResultSet: default public void setLocalDate(int parameterIndex, LocalDate localDate) { if (localDate == null) { setDate(parameterIndex, null); } else { ZoneId utc = ZoneId.of(“UTC”); java.util.Date utilDate = java.util.Date.from(localDate.atStartOfDay(utc).toInstant()); Date sqlDate = new Date(utilDate.getTime()); setDate(parameterIndex, sqlDate, Calendar.getInstance(TimeZone.getTimeZone(utc))); } […]

Arrays.sort()和Arrays.parallelSort()之间的区别

正在阅读这里提到的Java 8function。 无法理解parallelSort()确切作用。 有人可以解释sort()和parallelSort()之间的实际区别是什么?

Java 8中的顺序流是否在调用collect时使用组合器参数?

如果我在顺序流上调用collect(例如,从调用Collection.stream()),那么它将使用我传递的汇编参数来收集吗? 我猜不是,但我在文档中看不到任何内容。 如果我是正确的,那么似乎不幸的是必须提供我知道不会被使用的东西(如果我知道它是顺序流)。

使用lambdas和generics时,对方法的引用是不明确的

我收到以下代码的错误,我认为不应该存在…使用JDK 8u40编译此代码。 public class Ambiguous { public static void main(String[] args) { consumerIntFunctionTest(data -> { Arrays.sort(data); }, int[]::new); consumerIntFunctionTest(Arrays::sort, int[]::new); } private static void consumerIntFunctionTest(final Consumer consumer, final IntFunction generator) { } private static void consumerIntFunctionTest(final Function consumer, final IntFunction generator) { } } 错误如下: 错误:(17,9)java:对consumerIntFunctionTest的引用与net.tuis.ubench.Ambiguous中的方法consumerIntFunctionTest(java.util.function.Consumer,java.util.function.IntFunction)和方法consumerIntFunctionTest(java.util。)都不明确。 net.tuis.ubench.Ambiguous匹配中的function.Function,java.util.function.IntFunction) 错误发生在以下行: consumerIntFunctionTest(Arrays::sort, int[]::new); 我相信应该没有错误,因为所有Arrays::sort引用都是void类型,并且它们都没有返回值。 正如您所看到的,当我明确扩展Consumer lambda时,它确实有效。 这真的是javac中的错误,还是JLS声明lambda在这种情况下无法自动扩展? 如果是后者,我仍然认为这很奇怪,因为带有第一个参数Function […]

根据Java 8中的LocalDate.now()获取一周的第一天的日期

我希望根据LocalDate.now()得到一周中第一天的日期。 使用JodaTime可以实现以下function,但似乎已从Java 8中的新Date API中删除。 LocalDate now = LocalDate.now(); System.out.println(now.withDayOfWeek(DateTimeConstants.MONDAY)); 我不能称’withDayOfWeek()’,因为它不存在。 所以我的问题是:如何根据一些LocalDate获取一周中第一天的日期?

Hibernate 4使用java.time.LocalDate和DATE()构造

我正在尝试在我的应用程序中使用LocalDate和LocalDateTime与Java 8。 我正在使用Hibernate 4.3.5和Spring。 我在这里遵循了这个有趣的教程,但是当我使用DATE()构造时,我遇到了一个问题。 当我尝试做: SELECT * FROM TABLE WHERE DATE(data)=DATE(:data) 如果我手动创建的查询(复制和过去的查询Hibernate打印)工作正常,我总是一个空列表。 我认为问题在于Hibernate内部进行的转换; 它尝试将LocalDate转换为java.util.Date。 我告诉这个,因为如果我以这种方式更改查询: SELECT * FROM TABLE WHERE DATE(data)=:data 我有这个例外: java.lang.IllegalArgumentException: Parameter value [2014-05-27T00:00] did not match expected type [java.util.Date (n/a)] at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:885) at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:80) at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:248) at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:631) at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:180) at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:49) at it.AppuntamentoCustomRepositoryImpl.findAppuntamenti(AppuntamentoCustomRepositoryImpl.java:95) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) […]