Tag: java 8

为什么使用invokedynamic调用Java 8 lambdas?

invokedynamic指令用于帮助VM在运行时确定方法引用,而不是在编译时硬连线。 这在dynamic语言中非常有用,在运行时,确切的方法和参数types是不知道的。 但是Java lambda不是这种情况。 它们被翻译成具有明确定义的参数的静态方法。 而且这个方法可以使用invokestatic来调用。 那么对lambdaexpression式invokedynamic的需求是什么,特别是当性能受到影响的时候呢?

Java 8列表与stream映射

我有一个List<Item>集合。 我需要将其转换为Map<Integer, Item>地图的关键字必须是集合中项目的索引。 我不知道如何做到这一点与stream。 就像是: items.stream().collect(Collectors.toMap(…)); 任何帮助? 由于这个问题被认为是可能的重复我需要补充一点,我的具体问题是 – 如何获得列表中的项目的位置,并把它作为一个关键的价值

为什么Stream.allMatch()对于空stream返回true?

我的同事和我有一个错误是由于我们的假设,一个空的stream调用allMatch()将返回false 。 if (myItems.allMatch(i -> i.isValid()) { //do something } 当然,假设和不读文档是我们的错。 但是我不明白为什么空stream的默认allMatch()行为返回true 。 这是什么原因? 和anyMatch() (相反地返回false)一样,这个操作是以一种命令的方式来使用的,它离开monad,可能用在if语句中。 考虑到这些事实,是否有任何理由为什么allMatch()默认为true空stream是可取的大多数用途?

为现有的Stream添加新的值

是否有一个很好的方法来为现有的Stream添加一个新的值? 我能想像的是这样的: public <T> Stream<T> addToStream(Stream<T> stream, T elem ) { List<T> result = stream.collect(Collectors.toList()); result.add(elem); return result.stream(); } 但是我正在寻找更简洁的东西,我可以在没有冗长的lambdaexpression式中使用。 当我尝试实施PECS原则时出现了另一个问题: public <T> Stream<? super T> addToStream(Stream<? super T> stream, T elem ) { List<? super T> result = stream.collect(Collectors.toList()); //error result.add(elem); return result.stream(); } 似乎通配符不工作与Stream.collect ,我想知道为什么。 提前致谢。

有没有人将Lambda Expressions移植到Java 7?

读了Java 8从lambdas中产生的字节码types后 ,我想起Java 5发布的时候了。 那时候有Retroweaver和其他工具来转换用JDK 5编译的字节码以在JRE 1.4上运行。 有没有人为Java 8 lambdas创build了这样的backporting工具? Java开发人员现在就可以开始使用lambdas生产品质的Java 7 JRE,而不必等待Java 8 GA版本的6-12个月。 这里是我的分析,为什么像backporter应该可以相对容易地实现: Java 8 lambdas似乎没有使用Java 7不具备的任何JVM特性(例如invokedynamic ), java.lang.invoke.LambdaMetafactory类及其依赖关系看起来像纯Java,所以应该可以实现它们在第三方库中。 因此,使用JDK 8编译的字节码可以通过添加第三方库和LambdaMetafactory副本(位于不同的包中)并通过转换字节码来使用该元数据库来运行JRE 7。 也许还会生成一些合成类和方法来绕过可访问性检查,就像java.lang.invoke.MagicLambdaImpl似乎暗示的那样。 或者为所有lambda生成匿名内部类,就像第一个启用了lambda的Early Access JDK所做的那样。

GWT中的Java 8支持

这似乎是一个非常基本的问题,但是我search了很多,几乎没有发现任何地方。 所以,我会在这里问。 在GWT中支持Java 8的新语言结构的当前计划是什么? 另外,提议的Java 8库的哪个子集将用于客户端仿真? streamAPI? 新的date/时间API? 最后,关于这个重要议题的讨论在哪里进行? 我确信有很多人愿意参与这项工作,并可能对此做出贡献。 Java 8 beta版已经出现了一段时间,并且有很多文章讨论了这些API。 今年晚些时候它应该是相关的,所以似乎过去至less是在讨论如何以及何时将期望的语言特征引入GWT。 我很抱歉,如果这个问题在别的地方回答,或者如果我错过了一些重要的相关信息。 即使已经得到解答,这将是一个链接到这些信息的好地方。 谢谢!

为什么这个方法引用赋值编译?

我很努力地看到为什么下面的代码编译: public class MethodRefs { public static void main(String[] args) { Function<MethodRefs, String> f; f = MethodRefs::getValueStatic; f = MethodRefs::getValue; } public static String getValueStatic(MethodRefs smt) { return smt.getValue(); } public String getValue() { return "4"; } } 我可以明白为什么第一个赋值是有效的 – getValueStatic显然匹配指定的Functiontypes(它接受一个MethodRefs对象并返回一个String ),但是第二个让我感到困惑 – getValue方法不接受任何参数,为什么它仍然是有效的把它分配给f ?

将eclipse升级到java 8

我正在尝试将我的eclipse环境更新到java 8.我安装了jdk和jre版本8.我也这样做了: https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler 然后在项目 – >属性 – > java构buildpath – > JRE系统库 – >编辑 – >执行环境 – > JavaSE-1.8(unbound),这是唯一的选项,其名称中的Java 8。 但是当我select它时说:在指定的执行环境兼容的工作区中没有JRE:JavaSE-1.8

正确安装Java 8和Java 7

我已经在我的Windows 7机器上安装了JDK 1.7,并安装了JDK 1.8 u20后,我有以下错误: C:\>java -version Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' has value '1.8', but '1.7' is required. Error: could not find java.dll Error: Could not find Java SE Runtime Environment. 我的PATHvariables指向较旧的版本(即1.7)。 这里有什么错,我可以如何使用Java 8与Java 7?

项目组件java版本1.8不存在

我正在尝试在Eclipse中使用Java 8(和Wildfly appServer)构buildDynamic Web Application ,但是我无法使Eclipse Luna M5使用Java 8(我已经安装了Java 8 BETA支持,它可以在JavaSE上使用项目)。 在我的POM中,我将其设置为Java 8: <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> 但是我做了maven -> update project我得到以下错误: Could not update project ExampleApp configuration Version 1.8 of project facet java does not exist. 事实上,在project->preferences->project facets->java下没有java 1.8的项目方面 我可以手动创build这样的facet ,并将其添加到日食,或者我将不得不等待,直到Java 8发布和日食家伙决定添加它?