Tag: java 8

一个接口方法可以有一个正文?

我知道一个接口就像是一个100%纯粹的抽象类。 所以,它不能有方法的实现。 但是,我看到一个奇怪的代码。 任何人都可以解释吗? 代码片段: interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } } 编辑: 我的IDE是Intellij Idea 13.1。 项目SDK是java 7 <1.7.0_25>。 IDE没有显示任何编译器错误。 但是,当我在命令行编译代码时,我收到以下消息。 Whoa.java:2: error: modifier static not allowed here public static void doStuff() { ^

JPA支持Java 8新的date和时间API

我为我的新项目使用Java 8。 我试图在java 8中使用新的date和时间api,但是我不知道JPA 2.1完全支持这个新的date和时间API或不。 请分享您的经验/意见在JPA的支持新的date和时间API在Java 8。 我可以安全地使用JPA 2.1在Java 8中使用新的date和时间api吗? 更新: 我正在使用Hibernate(4.3.5.Final)作为JPA实现。

Android Studio – 提供的javaHome不是一个有效的文件夹

我决定将我的JDK更新到Java 8,并安装到具有jre子目录的C:\Program Files\Java\jdk1.8.0的默认位置。 我不确定Android Studio如何编译JDK位置,因此我决定启动它并查看。 我收到以下消息: 无法完成Gradle执行。 原因:提供的javaHome不是有效的文件夹。 您提供了:C:\ Program Files \ Java \ jdk1.7.0_45 我更新了我的JAVA_HOME环境variables(包括系统和用户)指向新的path,并尝试将其添加到我的PATHvariables,但每次我尝试在Android Studio中构build时,我都会得到相同的消息。 引用的path在我的环境variables中找不到,那么从哪里得到它,我怎样才能改变它呢? 谢谢

Java 8比较器types推断非常困惑

我一直在查看Collections.sort和list.sort之间的区别,特别是关于使用Comparator静态方法以及在lambdaexpression式中是否需要参数types。 在我们开始之前,我知道我可以使用方法引用,例如Song::getTitle来克服我的问题,但是我的查询并不是我想要解决的问题,而是我想要的答案,即为什么Java编译器要处理就这样。 这些是我的发现。 假设我们有一个Songtypes的ArrayList ,添加了一些歌曲,有3个标准的获取方法: ArrayList<Song> playlist1 = new ArrayList<Song>(); //add some new Song objects playlist.addSong( new Song("Only Girl (In The World)", 235, "Rhianna") ); playlist.addSong( new Song("Thinking of Me", 206, "Olly Murs") ); playlist.addSong( new Song("Raise Your Glass", 202,"P!nk") ); 这是对这两种types的sorting方法的调用,没有问题: Collections.sort(playlist1, Comparator.comparing(p1 -> p1.getTitle())); playlist1.sort( Comparator.comparing(p1 -> p1.getTitle())); 一旦我开始链接thenComparing ,会发生以下情况: Collections.sort(playlist1, Comparator.comparing(p1 -> […]

对于每个可能返回null的方法,我应该使用Java8 / Guava Optional吗?

可选用来表示可空对象,这个类的一些用法包括 作为返回types的方法,作为返回null的替代方法 表示没有可用的值 为了区分“未知”(例如,不存在于地图中)和“已知没有价值”(存在于地图中,具有值 Optional.absent()) 要将不可用的引用存储在不支持null的集合中(尽pipe还有其他几种应该首先考虑的方法) 对于第一种情况,我是否需要返回可选的所有可空的返回方法?

为什么Java 8中的新java.util.Arrays方法没有为所有的基本types重载?

我正在评论Java 8的API更改,并且我注意到java.util.Arrays中的新方法对于所有基元都没有重载。 我注意到的方法是: parallelSetAll parallelPrefix spliterator stream 目前这些新的方法只能处理int , long和double基元。 int , long和double可能是使用最广泛的原语,所以如果他们必须限制API,他们会select这三个,但是为什么他们不得不限制API呢?

使用新的date时间API格式化date

我正在玩新的date时间API,但运行时: public class Test { public static void main(String[] args){ String dateFormatted = LocalDate.now() .format(DateTimeFormatter .ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(dateFormatted); } } 它抛出: Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay at java.time.LocalDate.get0(LocalDate.java:680) at java.time.LocalDate.getLong(LocalDate.java:659) at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543) at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182) at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745) at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719) at java.time.LocalDate.format(LocalDate.java:1685) at Test.main(Test.java:23) 在查看LocalDate类的源代码时,我看到: private int get0(TemporalField field) { switch ((ChronoField) […]

HashMap Java 8实现

根据以下链接文档: Java HashMap实现 我混淆了HashMap的实现(或者说,在HashMap的增强)。 我的查询是: 首先 static final int TREEIFY_THRESHOLD = 8; static final int UNTREEIFY_THRESHOLD = 6; static final int MIN_TREEIFY_CAPACITY = 64; 为什么以及如何使用这些常量? 我想要一些清楚的例子。 他们如何通过这个实现业绩增长? 其次 如果您在JDK中看到HashMap的源代码,您会发现以下静态内部类: static final class TreeNode<K, V> extends java.util.LinkedHashMap.Entry<K, V> { HashMap.TreeNode<K, V> parent; HashMap.TreeNode<K, V> left; HashMap.TreeNode<K, V> right; HashMap.TreeNode<K, V> prev; boolean red; TreeNode(int arg0, K […]

一种更好的方法来以function的方式处理exception

在Java 8中使用FP惯用语时,exception(尤其是被选中的exception)会严重中断程序逻辑的stream向。下面是一个任意的例子: String s1 = "oeu", s2 = "2"; Stream.of(s1, s2).forEach(s -> System.out.println(Optional.of(s).map(Integer::parseInt).get())); 上面的代码在不可parsing的string出现exception时中断。 但是说我只想用一个默认值replace它,就像我可以使用Optional : Stream.of(s1, s2).forEach(s -> System.out.println(Optional.of(s) .map(Integer::parseInt) .orElse(-1))); 当然,这仍然失败,因为Optional只处理null s。 我想要的东西如下: Stream.of(s1, s2).forEach(s -> System.out.println( Exceptional.of(s) .map(Integer::parseInt) .handle(NumberFormatException.class, swallow()) .orElse(-1))); 注意:这是一个自我回答的问题。

Java 8默认方法是否打破源代码兼容性?

一般情况下,Java源代码已经向前兼容。 据我所知,在Java 8之前,编译后的类和源代码都与后来的JDK / JVM版本兼容。 [更新:这是不正确的,见下面的评论重新'枚举'等]。但是,随着在Java 8中添加默认方法,这似乎不再是这种情况。 例如,我一直使用的库有java.util.List的实现,它包含一个List<V> sort() 。 此方法返回已sorting列表内容的副本。 这个部署为jar文件依赖项的库在使用JDK 1.8构build的项目中运行良好。 然而,后来我有机会使用JDK 1.8重新编译库本身,我发现库不再编译:带有自己的sort()方法的List实现类现在与Java 8 java.util.List.sort()默认方法。 Java 8 sort()默认方法对列表进行sorting(返回void ); 我的库的sort()方法 – 因为它返回一个新的sorting列表 – 具有不兼容的签名。 所以我的基本问题是: 由于默认方法,JDK 1.8是否为Java源代码引入了前向不兼容? 也: 这是第一次这样的前锋不兼容的变化吗? 当devise和实施的默认方法是否被考虑或讨论过? 它logging在任何地方吗? 这个(确实很小)的不便是折扣而不是好处? 以下是一些在1.7下编译和运行的代码,运行于1.8以下 – 但不能在1.8下编译: import java.util.*; public final class Sort8 { public static void main(String[] args) { SortableList<String> l = new SortableList<String>(Arrays.asList(args)); […]