标签: java-8

如何在Java 8中将列表列表转换为列表?

如果我有一个List<List<Object>>,我如何List<Object>通过使用Java 8的功能将其转换为包含相同迭代顺序中的所有对象?

java collections java-8

470
推荐指数
8
解决办法
24万
查看次数

将java.util.Date转换为java.time.LocalDate

java.util.Date对象转换为新的JDK 8/JSR-310 的最佳方法是什么java.time.LocalDate

Date input = new Date();
LocalDate date = ???
Run Code Online (Sandbox Code Playgroud)

java datetime java-8 java-time

463
推荐指数
9
解决办法
39万
查看次数

在java.time.LocalDateTime和java.util.Date之间转换

Java 8有一个全新的日期和时间API.此API中最有用的类之一是LocalDateTime,用于保存与时区无关的日期时间值.

java.util.Date为此目的,使用遗留类可能有数百万行代码.因此,当连接新旧代码时,需要在两者之间进行转换.由于似乎没有直接的方法来实现这一点,怎么办呢?

java datetime java-8 java-time

456
推荐指数
7
解决办法
39万
查看次数

我应该尽可能使用并行流吗?

使用Java 8和lambdas,可以很容易地将集合作为流进行迭代,并且易于使用并行流.来自docs的两个例子,第二个使用parallelStream:

myShapesCollection.stream()
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

myShapesCollection.parallelStream() // <-- This one uses parallel
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));
Run Code Online (Sandbox Code Playgroud)

只要我不关心顺序,使用并行是否总是有益的?人们会认为将更多核心的工作划分得更快.

还有其他考虑因素吗?什么时候应该使用并行流?什么时候应该使用非并行?

(这个问题被要求引发关于如何以及何时使用并行流的讨论,而不是因为我认为总是使用它们是一个好主意.)

java parallel-processing java-8 java-stream

455
推荐指数
5
解决办法
14万
查看次数

抛出异常的Java 8 Lambda函数?

我知道如何创建对具有String参数并返回一个方法的方法的引用int,它是:

Function<String, Integer>
Run Code Online (Sandbox Code Playgroud)

但是,如果函数抛出异常,这不起作用,比如说定义为:

Integer myMethod(String s) throws IOException
Run Code Online (Sandbox Code Playgroud)

我该如何定义这个参考?

java lambda java-8

438
推荐指数
14
解决办法
28万
查看次数

Java 8 Iterable.forEach()vs foreach循环

在Java 8中,以下哪项更好?

Java 8:

joins.forEach(join -> mIrc.join(mSession, join));
Run Code Online (Sandbox Code Playgroud)

Java 7:

for (String join : joins) {
    mIrc.join(mSession, join);
}
Run Code Online (Sandbox Code Playgroud)

我有很多可以用lambdas"简化"的for循环,但使用它们真的有什么好处吗?它会改善他们的性能和可读性吗?

编辑

我还将这个问题扩展到更长的方法.我知道你不能从lambda中返回或破坏父函数,在比较它们时也应该考虑到这一点,但还有什么需要考虑的吗?

java for-loop java-8 java-stream

436
推荐指数
7
解决办法
35万
查看次数

从Java 8中的java.util.stream.Stream中检索List

我正在玩Java 8 lambdas来轻松过滤集合.但我没有找到一种简洁的方法来将结果作为新列表检索到同一语句中.到目前为止,这是我最简洁的方法:

List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);
Run Code Online (Sandbox Code Playgroud)

网上的例子没有回答我的问题,因为他们停止而没有生成新的结果列表.必须有一个更简洁的方式.我本来期望的是,Stream类有方法为toList(),toSet(),...

有没有办法targetLongList可以直接由第三行分配变量?

collections lambda java-8 java-stream

431
推荐指数
7
解决办法
31万
查看次数

如何将迭代器转换为流?

我正在寻找一种简洁的方法来将Iterator一个Stream或更具体的转换为"视图"迭代器作为流.

出于性能原因,我想在新列表中避免使用迭代器的副本:

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection<String> copyList = new ArrayList<String>();
sourceIterator.forEachRemaining(copyList::add);
Stream<String> targetStream = copyList.stream();
Run Code Online (Sandbox Code Playgroud)

根据评论中的一些建议,我也尝试使用Stream.generate:

public static void main(String[] args) throws Exception {
    Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
    Stream<String> targetStream = Stream.generate(sourceIterator::next);
    targetStream.forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到了NoSuchElementException(因为没有调用hasNext)

Exception in thread "main" java.util.NoSuchElementException
    at java.util.AbstractList$Itr.next(AbstractList.java:364)
    at Main$$Lambda$1/1175962212.get(Unknown Source)
    at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351)
    at java.util.Spliterator.forEachRemaining(Spliterator.java:326)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at Main.main(Main.java:20)
Run Code Online (Sandbox Code Playgroud)

我已经看过StreamSupportCollections,但我没有发现任何东西.

java iterator java-8

425
推荐指数
6
解决办法
18万
查看次数

Java 8属性不同

在Java 8中,如何Stream通过检查每个对象的属性的清晰度来使用API 过滤集合?

例如,我有一个Person对象列表,我想删除具有相同名称的人,

persons.stream().distinct();
Run Code Online (Sandbox Code Playgroud)

将使用Person对象的默认相等检查,所以我需要像,

persons.stream().distinct(p -> p.getName());
Run Code Online (Sandbox Code Playgroud)

不幸的是,该distinct()方法没有这种过载.如果不修改类中的相等性检查,Person是否可以简洁地执行此操作?

java collections java-8 java-stream

406
推荐指数
20
解决办法
24万
查看次数

使用Java 8 JDK将Iterable转换为Stream

我有一个返回的界面java.lang.Iterable<T>.

我想使用Java 8 Stream API来操纵该结果.

但是Iterable不能"流".

知道如何将Iterable用作Stream而不将其转换为List吗?

java iterable java-8 java-stream

402
推荐指数
6
解决办法
11万
查看次数