新的Java 8流框架及其朋友可以编写一些非常简洁的Java代码,但我遇到过一个看似简单的情况,但要做到简洁却很棘手。

考虑一个列表<Thing> things and method Optional<Other> resolve(Thing Thing)。我想映射的东西可选<其他>s,并获得第一个其他。

显而易见的解决方案是使用things.stream().flatMap(this::resolve). findfirst(),但flatMap要求您返回一个流,而Optional没有stream()方法(或者它是一个集合或提供一个方法将其转换为或将其视为一个集合)。

我能想到的最好的是:

things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();

但对于一个很普通的例子来说,这似乎太啰嗦了。

有人有更好的主意吗?

我知道有些关于java.util.Date和Joda-Time的问题。但经过一番挖掘,我找不到一个关于java之间差异的帖子。time API (Java 8中新增,由JSR 310定义)和Joda-Time。

我听说Java 8是Java。time API比Joda-Time更干净,可以做更多的事情。但我找不到比较这两者的例子。

什么可以java。时间做不到的事,时间做不到? 什么可以java。时间胜过joda时间? java.time的性能更好吗?

我想用一下

java.util.Optional.orElseThrow()

使用Exception类型请求构造函数形参。就像这样:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

是否有一种方法可以创建一个传递参数值的Supplier ?

因此,我在一段时间前安装了JDK 8的测试版,以查看一些示例。我想,到目前为止,在不同版本之间进行更改是很容易的。

用IntelliJ开发游戏。由于某些原因,IntelliJ正在使用8编译,即使:

我在首选项中将编译器设置为使用1.6 据说它通过外部构建使用SBT,但从命令行使用SBT是有效的 JAVA_HOME指向JDK 6。

如果我转到Java首选项页面,它确实显示安装了8个,但没有卸载它的选项,也看不到任何其他版本。

当我执行哪个java时,它会告诉我/usr/bin/java然后执行/usr/bin/java -version,它会返回1.6。

注意:只需稍作调整,就可以使用IntelliJ和JDK7,见这里。

在Java 8中,我们有类Stream<T>,它奇怪地有一个方法

Iterator<T> iterator()

所以你会期望它实现接口Iterable<T>,这需要这个方法,但事实并非如此。

当我想使用foreach循环遍历一个流时,我必须做如下的事情

public static Iterable<T> getIterable(Stream<T> s) {
    return new Iterable<T> {
        @Override
        public Iterator<T> iterator() {
            return s.iterator();
        }
    };
}

for (T element : getIterable(s)) { ... }

我是不是遗漏了什么?

我有一个外部API,它返回我的时间长度,表示为Epoch开始以来的毫秒数。

使用旧风格的Java API,我将简单地从它构造一个Date

Date myDate = new Date(startDateLong)

在Java 8的LocalDate/LocalDateTime类中有什么等价的?

我感兴趣的是将long表示的时间点转换为当前本地时区中的LocalDate。

Java并发实践仍然有效吗?我想知道书中描述的思想、概念和实现是否仍然符合最新的Java版本。

我这么问是因为最新的版本是2006年完成的。

在使用Java 8可选类时,有两种方法可以将值包装在可选类中。

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

我明白可选的。ofNullable是唯一安全的使用Optional的方式,但是为什么Optional。存在吗?为什么不直接使用Optional呢?nullable和在任何时候都是安全的?

假设我在Java 8中有以下功能接口:

interface Action<T, U> {
   U execute(T t);
}

在某些情况下,我需要一个没有参数或返回类型的操作。所以我写 就像这样:

Action<Void, Void> a = () -> { System.out.println("Do nothing!"); };

但是,它给了我编译错误,我需要把它写成

Action<Void, Void> a = (Void v) -> { System.out.println("Do nothing!"); return null;};

这很难看。是否有办法摆脱Void类型参数?

有时候你想用多个条件过滤一个流:

myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...

或者你也可以用一个复杂的条件和一个过滤器做同样的事情:

myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...

我猜测第二种方法具有更好的性能特征,但我不确定。

第一种方法在可读性方面更胜一筹,但是哪种方法对性能更好呢?