Tag: java 8

Java 8默认方法作为特征:安全吗?

在Java 8中使用默认方法作为穷人的特征版本是否安全? 有人说,如果你为了这个目的而使用它们,可能会让pandas伤心 ,因为它很酷,但那不是我的意图。 也常常提醒我们,引入默认方法来支持API进化和向后兼容,这是真实的,但这并不是错误的或扭曲的使用它们本身。 记住下面的实际用例 : public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } 或者,也许定义一个PeriodTrait : public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { … } } 有意思的是,可以使用组合(甚至是辅助类),但是它看起来更冗长和混乱,不能从多态性中受益。 那么, 使用默认方法作为基本特征可以吗?或者我应该担心不可预见的副作用? 关于SO的几个问题与Java和Scala特性有关; 这不是重点。 我也不只是要求意见。 相反,我正在寻找一个权威的答案或至less是现场的见解:如果你已经使用默认方法作为企业项目的特征,那么它是否会变成一个时间炸弹?

在Java中从java.util.stream.Stream中检索列表

我正在玩Java 8 lambda来轻松过滤集合。 但是,我没有find一个简洁的方法来检索结果作为一个新的列表在同一语句。 这是我迄今为止最简洁的方法: List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L); List<Long> targetLongList = new ArrayList<>(); sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add); 网上的例子没有回答我的问题,因为他们停止,而不会产生一个新的结果列表。 必须有一个更简洁的方法。 我会期望, Stream类的方法有toList() , toSet() ,… 有没有一种方法,variablestargetLongList可以直接由第三行分配?

从Mac删除Java 8 JDK

所以我刚才安装了JDK 8的testing版,看一些例子。 到目前为止我确信,在版本之间切换是很容易的。 用IntelliJ做一些Play开发。 出于某种原因,IntelliJ正在编译8,即使: 我的编译器设置在首选项使用1.6 据说它是通过外部构build使用SBT,但是从命令行运行 JAVA_HOME指向JDK 6。 如果我转到Java Preferences页面,它确实显示了8个安装,但是没有选项可以卸载它,并且看不到任何其他版本。 当我做which java ,它告诉我/usr/bin/java ,我做/usr/bin/java -version ,它返回1.6。 注意:稍微摆弄一下,可以使用IntelliJ和JDK7,请看这里 。

如何在Mac上安装Java 8

我想用最新的JavaFX做一些编程,这需要Java 8.我使用IntelliJ 13 CE和Mac OS X 9 Mavericks。 我运行Oracle的Java 8安装程序,文件看起来像他们最终在 /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk 但以前的版本是 /System/Library/Java/JavaFrameworks/jdk1.6…. 不知道为什么最新的安装程序把它放在/Library而不是/System/Library (或者区别是什么)。 但/usr/libexec/java_home没有find1.8,所以我发现如何设置你当前的Java版本的所有post都不起作用。 我已经尝试添加一个符号链接,使它看起来像1.8是在/System/Library…path,但它没有帮助。 /usr/libexec/java_home -V仍然只列出旧的java 1.6。 具有讽刺意味的是,系统偏好设置下的“Java”控制面板仅显示java 1.8! 为什么Oracle的安装程序不把它放在真正的地方? 我该如何解决这个问题?

Files.walk()计算总大小

我正在尝试计算光盘上文件的大小。 在java-7中,这可以使用Files.walkFileTree来完成,如我的答案所示。 但是,如果我想要使用java-8stream来完成这项工作,它将适用于某些文件夹,但不是全部。 public static void main(String[] args) throws IOException { long size = Files.walk(Paths.get("c:/")).mapToLong(MyMain::count).sum(); System.out.println("size=" + size); } static long count(Path path) { try { return Files.size(path); } catch (IOException | UncheckedIOException e) { return 0; } } 上面的代码将适用于patha:/files/但对于c:/它会抛出exception Exception in thread "main" java.io.UncheckedIOException: java.nio.file.AccessDeniedException: c:\$Recycle.Bin\S-1-5-20 at java.nio.file.FileTreeIterator.fetchNextIfNeeded(Unknown Source) at java.nio.file.FileTreeIterator.hasNext(Unknown Source) at java.util.Iterator.forEachRemaining(Unknown […]

java lambda返回一个lambda

我正在尝试在function性编程的新jdk8版本中做一个相对基本的东西,但是不能得到它的工作。 我有这个工作代码: import java.util.*; import java.util.concurrent.*; import java.util.stream.*; public class so1 { public static void main() { List<Number> l = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Callable<Object>> checks = l.stream(). map(n -> (Callable<Object>) () -> { System.out.println(n); return null; }). collect(Collectors.toList()); } } 它需要一个数字列表,并产生一个可以打印出来的函数列表。 然而,对Callable的显式转换似乎是多余的。 这似乎对我和IntelliJ。 我们都同意,这也应该工作: List<Callable<Object>> checks = l.stream(). map(n -> () -> { System.out.println(n); […]

如何使用reflection在Java 8中获取方法参数名称?

Java 8有能力使用Reflection API获取方法参数名称。 我怎样才能得到这些方法参数名称? 据我所知,类文件不存储forms参数名称。 我怎样才能得到这些使用reflection?

Java 8的新默认接口模型如何工作(包括菱形,多重inheritance和优先级)?

这个新的界面模型是如何工作的? 钻石问题可能是由此产生的 此实现的多重inheritance特性 以及使用接口实现的优先级?

如何获取Java 8方法引用的MethodInfo?

请看下面的代码: Method methodInfo = MyClass.class.getMethod("myMethod"); 这个工作,但方法名称是作为一个string传递,所以即使myMethod不存在,这将编译。 另一方面,Java 8引入了一个方法引用特性。 在编译时检查。 有可能使用此function获取方法信息? printMethodName(MyClass::myMethod); 完整的例子: @FunctionalInterface private interface Action { void invoke(); } private static class MyClass { public static void myMethod() { } } private static void printMethodName(Action action) { } public static void main(String[] args) throws NoSuchMethodException { // This works, but method name is passed […]

Java 8stream逆序

一般问题:什么是扭转stream的正确方法? 假设我们不知道stream包含的元素是什么types,那么什么是反转任何stream的通用方法? 具体问题: IntStream提供范围方法来生成特定范围内的整数IntStream.range(-range, 0) ,现在我想反转它切换范围从0到负将不会工作,我也不能使用Integer::compare List<Integer> list = Arrays.asList(1,2,3,4); list.stream().sorted(Integer::compare).forEach(System.out::println); 与IntStream我会得到这个编译器错误 错误:( IntStream )ajc:typesIntStream中的sorted()方法不适用于参数( Integer::compare ) 我在那里错过了什么?