请解释Java 8的lambda方法的语法.
有很多解释了那里什么拉姆达功能,但我找不到语法的详尽的解释,而我发现很难学会正确复制的语法,因为我不明白为什么他们"按原样重写.
这是我遇到的一个常见案例,由NetBeans提供:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new MainAppJFrame();
});
}
Run Code Online (Sandbox Code Playgroud)
所以,不知何故,以下lambda表达式正在解析为匿名Runnable对象的run()方法:
() -> {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这->是lambda语法,对吧?花括号只是包含匿名方法代码.括号是否为空参数,因为在这种情况下我们正在创建一个Runnable.run()方法?
这一点对我来说都不太清楚.我假设编译器知道Runnable根据SwingUtilities.invokeLater(Runnable)方法预期的类型实例化匿名?如果有两种SwingUtilities.invokeLater方法仅在参数列表中有所不同,会发生什么?显然在这个特定情况下没有,但在其他地方可能:
interface ExampleLambdaConsumer {
public void doSomething(Runnable r);
public void doSomething(java.lang.reflect.Method m);
}
class C implements ExampleLambdaConsumer {
// implementations for doSomething methods here
public static void main(String[] args) {
doSomething(() -> {
// lambda method body here …Run Code Online (Sandbox Code Playgroud) 由于已经知道它很容易地添加序列化支持lambda表达式时,目标接口已经不继承Serializable,只是喜欢(TargetInterface&Serializable)()->{/*code*/}.
我问,是一种反其道而行之,明确删除支持串行当目标接口不继承Serializable.
由于您无法从类型中删除接口,因此基于语言的解决方案可能看起来像(@NotSerializable TargetInterface)()->{/* code */}.但据我所知,没有这样的解决方案.(纠正我,如果我错了,这将是一个完美的答案)
即使在类实现时拒绝序列化是Serializable过去的合法行为,并且程序员控制下的类,模式看起来如下:
public class NotSupportingSerialization extends SerializableBaseClass {
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
throw new NotSerializableException();
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
throw new NotSerializableException();
}
private void readObjectNoData() throws ObjectStreamException {
throw new NotSerializableException();
}
}
Run Code Online (Sandbox Code Playgroud)
但是对于lambda表达式,程序员没有对lambda类的控制.
为什么有人会费心去除支持?好吧,除了生成包含Serialization支持的更大代码之外,它还会产生安全风险.请考虑以下代码:
public class CreationSite {
public static void main(String... arg) {
TargetInterface f=CreationSite::privateMethod;
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的eclipse环境更新为java 8.我安装了jdk和jre版本8.我也这样做了:
https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler
然后在项目 - >属性 - > java构建路径 - > JRE系统库 - >编辑 - >执行环境 - > JavaSE-1.8(未绑定)这是唯一一个在其名称中包含java 8的选项.但是当我选择它时它会说:工作空间中没有与指定执行环境兼容的JRE:JavaSE-1.8
在一个应用程序中,我有以下内容 -verbose:gc
[GC (Metadata GC Threshold) 8530310K->2065630K(31574016K), 0.3831399 secs]
[Full GC (Metadata GC Threshold) 2065630K->2053217K(31574016K), 3.5927870 secs]
[GC (Metadata GC Threshold) 8061486K->2076192K(31574016K), 0.0096316 secs]
[Full GC (Metadata GC Threshold) 2076192K->2055722K(31574016K), 0.9376524 secs]
[GC (Metadata GC Threshold) 8765230K->2100440K(31574016K), 0.0150190 secs]
[Full GC (Metadata GC Threshold) 2100440K->2077052K(31574016K), 4.1662779 secs]
Run Code Online (Sandbox Code Playgroud)
什么是"元数据GC阈值"以及如何减少它.注意:虽然Full GC花了很长时间进行清理,但它实际上会清理很多,即如果不这样做会更好.
我在我的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.
Run Code Online (Sandbox Code Playgroud)
我的PATH变量指向旧版本(即1.7).
这里有什么问题以及我如何使用java 8和java 7?
说我要创建n个项目.在Java 8之前,我会写:
List<MyClass> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(new MyClass());
}
Run Code Online (Sandbox Code Playgroud)
有一种优雅的方式来使用流来创建n个项目吗?
我想到了这个:
List<MyClass> list = Stream.iterate(0, i -> i).limit(10)
.map(o -> new MyClass()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
是否有标准/更好的编码方式?
请注意,实际使用情况稍微复杂一些,使用流会更灵活,因为我可以立即通过一行中的其他函数抽取项目,甚至无需创建对列表的引用,例如对它们进行分组:
Stream.iterate(0, i -> i).limit(10).map(o -> new MyClass())
.collect(Collectors.groupingBy(...));
Run Code Online (Sandbox Code Playgroud) 环境:Ubuntu x86_64(14.10),Oracle JDK 1.8u25
我尝试使用并行流Files.lines()但我想要.skip()第一行(它是带有标题的CSV文件).所以我试着这样做:
try (
final Stream<String> stream = Files.lines(thePath, StandardCharsets.UTF_8)
.skip(1L).parallel();
) {
// etc
}
Run Code Online (Sandbox Code Playgroud)
但是后来一列未能解析成一个int ...
所以我尝试了一些简单的代码.文件问题很简单:
$ cat info.csv
startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes
1422758875023;34;54;151;4375;4375;27486
$
Run Code Online (Sandbox Code Playgroud)
代码同样简单:
public static void main(final String... args)
{
final Path path = Paths.get("/home/fge/tmp/dd/info.csv");
Files.lines(path, StandardCharsets.UTF_8).skip(1L).parallel()
.forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
我系统地得到以下结果(好吧,我只运行了大约20次):
startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
编辑似乎问题或误解比这更根深蒂固(下面的两个例子是由FreeNode的## java编写的):
public static void main(final String... args)
{
new BufferedReader(new StringReader("Hello\nWorld")).lines()
.skip(1L).parallel()
.forEach(System.out::println);
final Iterator<String> iter
= Arrays.asList("Hello", "World").iterator();
final Spliterator<String> spliterator
= Spliterators.spliteratorUnknownSize(iter, …Run Code Online (Sandbox Code Playgroud) 我刚刚在64位Windows-10操作系统上安装了Java SE Development Kit 8u91.我设置了路径变量.我在命令提示符下尝试了java --version它给了我一个错误.
c:\Users\Onlymanu>java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试java -version时它起作用了.
我尝试初始化_JAVA_OPTIONS 环境变量,并尝试重新安装它们都没有工作.有人能帮帮我吗?
我想知道何时可以IntStream.range有效使用.我有三个原因,我不确定它有多大用处IntStream.range.
(请将开头和结尾视为整数.)
如果我想要一个数组,[start, start+1, ..., end-2, end-1]下面的代码要快得多.
int[] arr = new int[end - start];
int index = 0;
for(int i = start; i < end; i++)
arr[index++] = i;
Run Code Online (Sandbox Code Playgroud)
这可能是因为toArray()在IntStream.range(start, end).toArray()非常缓慢.
我使用MersenneTwister来重排数组.(我在网上下载了MersenneTwister课程.)我认为没有办法IntStream使用MersenneTwister 进行随机播放.
我不认为刚开int从数字start到end-1是很有用的.我可以使用for(int i = start; i < end; i++),这似乎更容易,而不是慢.
你能告诉我什么时候应该选择IntStream.range吗?
我感觉不到Java 8 Streams map()和mapToObj()方法之间的区别.在两者中我们都可以创建对象并将对象返回到流,所以为什么这些方法存在为两个,而不仅仅是一个.
你能用例子给我解释一下吗?
java-8 ×10
java ×9
java-stream ×4
lambda ×2
eclipse ×1
java-7 ×1
loops ×1
performance ×1
syntax ×1
upgrade ×1