Questions tagged «java8»

Java 8是指Java平台的最新版本。

1
相互实现两个Java 8默认方法是否是一种好习惯?
我正在设计一个具有两个相关方法的接口,类似于此方法: public interface ThingComputer { default Thing computeFirstThing() { return computeAllThings().get(0); } default List<Thing> computeAllThings() { return ImmutableList.of(computeFirstThing()); } } 大约一半的实现只会计算一件事,而另一半可能会计算更多。 这在广泛使用的Java 8代码中是否有先例?我知道Haskell在某些类型类中做类似的事情(Eq例如)。 好处是,与拥有两个抽象类(SingleThingComputer和MultipleThingComputer)相比,我必须编写更少的代码。 不利的一面是,一个空的实现可以编译,但是在运行时会用炸掉StackOverflowError。可以使用a来检测相互递归ThreadLocal并给出更好的错误,但这会增加非Buggy代码的开销。

5
“静态接口”是一种好习惯吗?
我刚刚注意到,在接口中可以选择使用静态方法。与接口的静态字段相同,有一个有趣的行为:这些不是继承的。 我不确定它在要实现的实际接口中是否有用。但是,它使程序员能够创建仅仅是静态内容的信封的接口,例如实用程序类。 一个简单的例子只是全局常量的包络。与班级相比,您可以轻松地注意到public static final那些假定的样板丢失了(使它不太冗长)。 public interface Constants { String LOG_MESSAGE_FAILURE = "I took an arrow to the knee."; int DEFAULT_TIMEOUT_MS = 30; } 您还可以使事情变得更复杂,例如配置键的伪枚举。 public interface ConfigKeys { static createValues(ConfigKey<?>... values) { return Collections.unmodifiableSet(new HashSet(Arrays.asList(values))); } static ConfigKey<T> key(Class<T> clazz) { return new ConfigKey<>(clazz); } class ConfigKey<T> { private …
13 java  java8 

2
Java 8 Stream实例是否应该始终是close()'?
对Javadoc的看法: 流具有BaseStream.close()方法并实现AutoCloseable,但实际上几乎所有流实例在使用后实际上都不需要关闭。通常,只有源是IO通道的流(例如,由Files.lines(Path,Charset)返回的流)才需要关闭。大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理。(如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源。) “几乎所有”和“通常”是模糊的-如果您正在编写库,并且要从该Stream的用户中提取Stream的源,那么无论如何,您总是必须问自己一个问题-“我应该关闭这个?” IO支持的流需要关闭,因为终端操作不会调用close,所以有效地我总是必须记住/记录我的Stream的来源,或者我总是必须这样close做。 我猜想,最明智的选择是不从方法中返回Streams或接受Stream参数,这是JDK团队中某些人所认同的观点。考虑到Streams的实用性,我发现这过于局限。 关闭Streams的最佳做法是什么?我在网上寻找了一些JDK人员的答案,这些人员通常都积极参与类似的社区问题,但是没有发现任何相关的内容。
12 java  resources  java8 

1
在Java 8中删除功能类型的原因
我一直试图理解为什么JDK 8 Lambda专家组(EG)决定不在Java编程语言中包括新的函数类型。 在邮件列表中,我找到了一个讨论删除函数类型的话题。 许多语句对我来说是模棱两可的,这可能是由于缺乏上下文,在某些情况下,是因为我对类型系统的实现了解有限。 但是,我相信我可以安全地在此站点中提出几个问题,以帮助我更好地理解它们的含义。 我知道我可以在邮件列表中提出问题,但是该线程很旧,并且所有决策都已制定,因此我很可能会被忽略,尤其是看到这些人已经推迟了他们的计划。 在支持删除功能类型并支持使用SAM类型的回答中,Brian Goetz说: 没有修复。关于修正函数类型的实用性有很长的篇幅。如果不进行具体化,函数类型将受到阻碍。 我找不到他提到的话题。现在,我可以理解,结构函数类型的引入可能暗示着Java(通常是名义上的类型)系统中的某些复杂性,我无法理解的是参数化SAM类型在具体化方面有何不同。 难道他们都没有受到相同的修复问题吗?有谁知道功能类型在参数化方面与参数化SAM类型有何不同? 格茨在另一条评论中说: 有两种基本的键入方法:标称方法和结构方法。名词的标识基于其名称;结构类型的标识基于其组成(例如“ int,int的元组”或“ int到float的函数”。)大多数语言大多选择名词性或结构性;除了“边缘”外,没有多少语言能够成功地混合名义和结构类型。Java几乎完全是名义上的(有一些例外:数组是结构型的,但是在底部总是有名义上的元素类型;泛型也有名义上的和结构上的混合,实际上这是许多源代码的一部分)人们对泛型的抱怨。)将结构类型系统(函数类型)嫁接到Java上 标称类型的系统意味着新的复杂性和边缘情况。函数类型的好处值得吗? 那些拥有实施类型系统经验的人。您知道他在这里提到的这些复杂性或极端情况的任何例子吗? 老实说,当我认为像Scala这样完全基于JVM的编程语言支持结构类型(如函数和元组)时,即使存在底层平台的验证问题,我也对这些指控感到困惑。 不要误会我的意思,我并不是说功能类型应该比SAM类型更好。我只想了解他们为什么做出这个决定。

2
如果您知道参数是可能需要或可能不需要的东西,是否有任何理由不使用Optional作为方法参数?
使用Java 8,我看到了越来越多有关Option / Optional用法的文章。我了解他们试图代表的意思,并且看到许多将它们用作回报的示例。但是我看不到它们在没有默认/可选参数语法的语言中被用作方法/函数参数。 Optional如果您知道该参数是可能需要或不需要的东西,是否有任何理由不用作方法参数?这是我想到的一个示例: Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.