标签: java-8

带有sorted()的java 8 parallelStream()

JDK 8 EA现在已经出局了,我只是想习惯lambda和新的Stream API.我试图用并行流对列表进行排序,但结果总是错误的:

import java.util.ArrayList;
import java.util.List;

public class Test
{
    public static void main(String[] args)
    {
        List<String> list = new ArrayList<>();
        list.add("C");
        list.add("H");
        list.add("A");
        list.add("A");
        list.add("B");
        list.add("F");
        list.add("");

        list.parallelStream() // in parallel, not just concurrently!
            .filter(s -> !s.isEmpty()) // remove empty strings
            .distinct() // remove duplicates
            .sorted() // sort them
            .forEach(s -> System.out.println(s)); // print each item
    }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

C
F
B
H
A
Run Code Online (Sandbox Code Playgroud)

请注意,每次输出都不同.我的问题是,这是一个错误吗?或者不可能并行排序列表?如果是这样,那么为什么JavaDoc没有声明呢?最后一个问题,还有另一个操作,其输出会根据流类型而有所不同吗?

java parallel-processing lambda java-8 java-stream

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

Linux上的JavaFX显示"图形设备初始化失败:es2,sw"

我刚开始在Linux上编写/测试JavaFX的东西,我在创建一个简单的应用程序时遇到了错误.在Foruns,我发现许多人对此有所了解,但我能找到一个明确的解释,说明它发生的原因.我想了解我的方案中缺少什么才能使其正常工作.

任何建议都会真正贬值.

环境信息:

java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b123)
Java HotSpot(TM) Client VM (build 25.0-b65, mixed mode)

Linux MYServer 2.6.21-1.3228.fc7 #1 SMP Tue Jun 12 15:37:31 EDT 2007 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

例外:

Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
        at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:300)
        at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:244)
        at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:179)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:210)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:653)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:314)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at …
Run Code Online (Sandbox Code Playgroud)

java linux javafx java-8

32
推荐指数
6
解决办法
4万
查看次数

使用Java 8在几分钟内完成

所以我很幸运能够使用Java 8和新的时间APi,但我没有看到任何舍入函数......

基本上如果时间是......

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000
Run Code Online (Sandbox Code Playgroud)

这似乎没问题,但是对吗?

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1);

System.out.println(newTime.toString());
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000")));
Run Code Online (Sandbox Code Playgroud)

datetime rounding ceil java-8 java-time

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

为什么Java 8中的接口允许使用main方法?

为什么允许接口main在Java 8中使用方法?

如下面的代码所述,它工作正常并正确产生输出.

public interface Temp {
    public static void main(String args[]){
         System.out.println("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

目前它表现得像一个类,我interface用main方法执行.

我们为什么需要这个?

java java-8

32
推荐指数
3
解决办法
3981
查看次数

Java 8收集器,如果只有一个值,则返回一个值

我在这个函数式编程和流程方面有点绿色,但我知道的一点点非常有用!

我已经多次出现这种情况了:

List<SomeProperty> distinctProperties = someList.stream()
    .map(obj -> obj.getSomeProperty())
    .distinct()
    .collect(Collectors.toList());

if (distinctProperties.size() == 1) {
    SomeProperty commonProperty = distinctProperties.get(0);
    // take some action knowing that all share this common property
}
Run Code Online (Sandbox Code Playgroud)

我真正想要的是:

Optional<SomeProperty> universalCommonProperty = someList.stream()
    .map(obj -> obj.getSomeProperty())
    .distinct()
    .collect(Collectors.singleOrEmpty());
Run Code Online (Sandbox Code Playgroud)

我认为singleOrEmpty除了与之相结合之外,这个东西在其他情况下也很有用distinct.当我是一个超级n00b时,我花了很多时间重新发明Java Collections Framework,因为我不知道它在那里,所以我不想重复我的错误.Java是否有一个很好的方法来做这singleOrEmpty件事?我错误地制定了它吗?

谢谢!

编辑:这是distinct案例的一些示例数据.如果您忽略该map步骤:

Optional<SomeProperty> universalCommonProperty = someList.stream()
    .map(obj -> obj.getSomeProperty())
    .distinct()
    .collect(Collectors.singleOrEmpty());

[]     -> Optional.empty()
[1]    -> Optional.of(1)
[1, 1] -> Optional.of(1)
[2, 2] -> Optional.of(2) …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

有没有办法让Java8持续一年的时间来说明闰年?

我需要一年中的天数,我想使用Java8的新时间api.

但是,我不能这样做,Duration.ofDays(365)因为它没有说明闰年.而且Duration.of(1, ChronoUnit.YEARS)不飞,因为java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration

我查看了Period,但它似乎对于从几年到几天都没用.

我觉得我在这里错过了一些东西?如果年份是闰年,我可以写一些东西来增加一天,但似乎我应该能够开箱即用.

java duration java-8

32
推荐指数
2
解决办法
6475
查看次数

使用Java 8 Lambda表达式将String数组转换为Map

是否有更好的功能方式将"key:value"形式的字符串数组转换为Map使用Java 8 lambda语法?

Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":")
        .collect(Collectors.toMap(keyMapper?, valueMapper?));
Run Code Online (Sandbox Code Playgroud)

我现在的解决方案似乎没有真正的功能:

Map<String, Double> kvs = new HashMap<>();
Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":"))
        .forEach(elem -> kvs.put(elem[0], Double.parseDouble(elem[1])));
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8 java-stream

32
推荐指数
1
解决办法
4万
查看次数

为什么方法引用可以使用非最终变量?

我对内部类和lambda表达有些困惑,我试着问一个问题,然后又出现了另一个疑问,并且可能更好地发布另一个问题,而不是评论前一个问题.

直截了当:我知道(谢谢Jon)这样的事情无法编译

public class Main {
    public static void main(String[] args) {
        One one = new One();

        F f = new F(){      //1
            public void foo(){one.bar();}   //compilation error
        };

        one = new One();
    }
}

class One { void bar() {} }
interface F { void foo(); }
Run Code Online (Sandbox Code Playgroud)

由于Java如何管理闭包,因为one不是[有效]最终等等.

但是,这怎么允许的呢?

public class Main {
    public static void main(String[] args) {
        One one = new One();

        F f = one::bar; //2

        one = …
Run Code Online (Sandbox Code Playgroud)

java lambda closures java-8 method-reference

32
推荐指数
3
解决办法
2021
查看次数

Java 8 - 在stream.map()中链接构造函数调用和setter

我上课了

class Foo{
    String name;
    // setter, getter
}
Run Code Online (Sandbox Code Playgroud)

它只有一个默认的构造函数.

然后,我试图Foo从一些字符串创建一个List :

Arrays.stream(fooString.split(","))
            .map(name -> {
                Foo x = new Foo();
                x.setName(name);
                return x;

            }).collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

由于没有构造函数采用名称,我不能简单地使用方法引用.当然,我可以使用构造函数调用和setter将这三行提取到一个方法中,但有没有更好或简洁的方法呢?(不更改Foo,这是生成的文件)

java lambda java-8 java-stream

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

为什么Instant不支持使用ChronoUnit.YEARS进行操作?

这对我来说意外:

> Clock clock = Clock.systemUTC();

> Instant.now(clock).minus(3, ChronoUnit.DAYS);
java.time.Instant res4 = 2016-10-04T00:57:20.840Z

> Instant.now(clock).minus(3, ChronoUnit.YEARS);
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我必须这样做:

> Instant.now(clock).atOffset(ZoneOffset.UTC).minus(3, ChronoUnit.YEARS).toInstant();
java.time.Instant res11 = 2013-10-07T01:02:56.361Z
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么Instant不支持YEARS.开发人员是否放弃了它?

(在我的实际代码中,我试图减去a,Period.ofYears(3)但引用的Instant方法最终被调用).

java openjdk java-8

32
推荐指数
2
解决办法
6050
查看次数