相关疑难解决方法(0)

Java中有限生成的流 - 如何创建一个?

在Java中,可以轻松地生成无限流Stream.generate(supplier).但是,我需要生成一个最终完成的流.

想象一下,例如,我想要一个目录中所有文件的流.文件数量可能很大,因此我无法预先收集所有数据并从中创建流(via collection.stream()).我需要逐个生成序列.但是流很明显会在某个时刻完成,终端运营商喜欢(collect()findAny())需要对它进行处理,因此Stream.generate(supplier)不适合这里.

有没有合理的简单方法在Java中执行此操作,而不是自己实现整个Stream接口?

我可以想到一个简单的黑客 - 用无限做它Stream.generate(supplier),并在获取所有实际值时提供null或抛出异常.但是它会破坏标准的流操作符,我只能将它用于我自己的操作符,这些操作符都知道这种行为.

澄清

评论中的人提议我takeWhile()操作员.这不是我的意思.如何更好地表达问题...我不是在问如何过滤(或限制)现有的流,我问如何动态创建(生成)流,而不是先加载所有元素,但是流会有有限的大小(事先未知).

我正在寻找的代码是

    Iterator it = myCustomIteratorThatGeneratesTheSequence();
    StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);
Run Code Online (Sandbox Code Playgroud)

我刚看了一下java.nio.file.Files,该list(path)方法是如何实现的.

java java-8 java-stream

39
推荐指数
1
解决办法
6954
查看次数

如何匹配流元素但如果不存在则返回false?

我有一个流,想检查是否所有匹配过滤器.如果全部匹配,则返回true.

但是,如果流是空的,我想回来false.

我怎样才能做到这一点?

示例代码:

public boolean validate(Stream<Whatever> stream) {
  // Problem: returns **true** if stream empty.
  // How can **false** be returned if stream is empty?
  return stream.allMatch(Whatever::someCheck);
}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

10
推荐指数
1
解决办法
3280
查看次数

溪流如何停止?

我想知道我何时创建自己的无限流,Stream.generate标准库中的Streams如何停止...

例如,当您有一个包含记录的列表时:

List<Record> records = getListWithRecords();
records.stream().forEach(/* do something */);
Run Code Online (Sandbox Code Playgroud)

流不会无限并且永远运行,但是当遍历列表中的所有项时它将停止.但是这有什么作用呢?相同的功能适用于由Files.lines(path)(源:http://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/)创建的流.

第二个问题,如何Stream.generate以相同的方式停止创建流?

infinite java-8 java-stream

8
推荐指数
1
解决办法
2469
查看次数

从大型未排序数组中删除重复项并保持顺序

我有一个未排序的整数数组,其中的值范围从 Integer.MIN_VALUE 到 Integer.MAX_VALUE。数组中的任何整数都可以有多个副本。我需要返回一个删除了所有重复项的数组,并保持元素的顺序。

例子:

int[] input = {7,8,7,1,9,0,9,1,2,8}
Run Code Online (Sandbox Code Playgroud)

输出应为 {7,8,1,9,0,2}

我知道这个问题可以通过使用来解决,LinkedHashSet但我需要一个不涉及大量缓冲区空间的解决方案。

java arrays duplicates

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

Java8流式类层次结构

我正在慢慢学习Java 8的新功能,并试图找到一种以流方式处理类层次结构(从子级到父级)的方法。

例如,在类或其父级上找到注释。

在Java 8之前,我会这样完成:

public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
    Class<?> t = type;
    T annot = null;
    while (t != null && annot == null) {
        annot = t.getAnnotation(annType);
        t = t.getSuperclass();
    }
    return annot;
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望以一种更加“功能性的编程”方式来做到这一点。我找不到比使用以下递归连接流更好的方法:

import java.lang.annotation.Annotation;
import java.util.stream.Stream;

public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
    return ClassIterator.streamSuperclass(type)
        .map(t -> t.getAnnotation(annType))
        .filter(a -> a != null)
        .findFirst()
        .orElse(null);
}

public static class ClassIterator {
    public static Stream<Class<?>> …
Run Code Online (Sandbox Code Playgroud)

reflection java-8 java-stream

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

标签 统计

java-8 ×4

java-stream ×4

java ×3

arrays ×1

duplicates ×1

infinite ×1

reflection ×1