标签: java-8

Java的lambda语法有什么细分?

请解释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)

java syntax lambda java-8

35
推荐指数
3
解决办法
7277
查看次数

可以显式删除lambda的序列化支持

由于已经知道它很容易地添加序列化支持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)

java lambda serialization java-8

35
推荐指数
1
解决办法
2423
查看次数

将eclipse升级到java 8

我正在尝试将我的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

java eclipse upgrade java-8

34
推荐指数
3
解决办法
7万
查看次数

什么是元数据GC阈值以及如何调整它?

在一个应用程序中,我有以下内容 -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花了很长时间进行清理,但它实际上会清理很多,即如果不这样做会更好.

java performance garbage-collection java-8

34
推荐指数
2
解决办法
2万
查看次数

正确安装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.
Run Code Online (Sandbox Code Playgroud)

我的PATH变量指向旧版本(即1.7).

这里有什么问题以及我如何使用java 8和java 7?

java java-7 java-8

34
推荐指数
2
解决办法
5万
查看次数

使用流迭代n次而不是使用for循环来创建n个项目

说我要创建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)

loops java-8 java-stream

34
推荐指数
2
解决办法
2万
查看次数

这是Files.lines()中的错误,还是我误解了并行流的某些内容?

环境: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)

java parallel-processing java-8 java-stream

34
推荐指数
3
解决办法
2842
查看次数

错误:无法创建Java虚拟机错误:发生了致命异常.程序将退出

我刚刚在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 环境变量,并尝试重新安装它们都没有工作.有人能帮帮我吗?

java java-8

34
推荐指数
9
解决办法
8万
查看次数

我什么时候应该在Java中使用IntStream.range?

我想知道何时可以IntStream.range有效使用.我有三个原因,我不确定它有多大用处IntStream.range.

(请将开头和结尾视为整数.)

  1. 如果我想要一个数组,[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()非常缓慢.

  2. 我使用MersenneTwister来重排数组.(我在网上下载了MersenneTwister课程.)我认为没有办法IntStream使用MersenneTwister 进行随机播放.

  3. 我不认为刚开int从数字startend-1是很有用的.我可以使用for(int i = start; i < end; i++),这似乎更容易,而不是慢.

你能告诉我什么时候应该选择IntStream.range吗?

java java-8 java-stream

34
推荐指数
3
解决办法
3万
查看次数

地图和mapToObj之间的Java Stream差异

我感觉不到Java 8 Streams map()mapToObj()方法之间的区别.在两者中我们都可以创建对象并将对象返回到流,所以为什么这些方法存在为两个,而不仅仅是一个.

你能用例子给我解释一下吗?

java java-8 java-stream

34
推荐指数
2
解决办法
8914
查看次数