标签: java-stream

递归流

我想使用Java 8以递归方式列出计算机上的所有文件.

Java 8提供了listFiles一种返回所有文件和目录但没有递归的方法.如何使用它来获取完整的递归文件列表(不使用变异集合)?

我已经尝试了下面的代码,但它只有一个深度:

static Function<Path, Stream<Path>> listFiles = p -> {
    if (p.toFile().isDirectory()) {
        try { return Files.list(p); }
        catch (Exception e) { return Stream.empty(); }
    } else {
        return Stream.of(p);
    }
};

public static void main(String[] args) throws IOException {
    Path root = Paths.get("C:/temp/");
    Files.list(root).flatMap(listFiles).forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

并且使用return Files.list(p).flatMap(listFiles);不编译(不确定为什么)...

注意:我对涉及FileVisitors或外部库的解决方案不感兴趣.

java recursion file java-8 java-stream

20
推荐指数
1
解决办法
7431
查看次数

如何从DirectoryStream创建流

在阅读API时,DirectoryStream我错过了很多功能.首先,它建议使用for循环从流到List.我想念它DirectoryStream不是一个事实Stream.

我怎样才能让一个Stream<Path>从DirectoryStreamJava中8?

java java-8 java-stream

20
推荐指数
2
解决办法
5774
查看次数

来自HashSet的并行流不会并行运行

我有要并行处理的元素集合.当我使用a时List,并行性有效.但是,当我使用a时Set,它并不是并行运行的.

我写了一个显示问题的代码示例:

public static void main(String[] args) {
    ParallelTest test = new ParallelTest();

    List<Integer> list = Arrays.asList(1,2);
    Set<Integer> set = new HashSet<>(list);

    ForkJoinPool forkJoinPool = new ForkJoinPool(4);

    System.out.println("set print");
    try {
        forkJoinPool.submit(() ->
            set.parallelStream().forEach(test::print)
        ).get();
    } catch (Exception e) {
        return;
    }

    System.out.println("\n\nlist print");
    try {
        forkJoinPool.submit(() ->
            list.parallelStream().forEach(test::print)
        ).get();
    } catch (Exception e) {
        return;
    }   
}

private void print(int i){
    System.out.println("start: " + i);
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
    }
    System.out.println("end: …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing lambda java-8 java-stream

20
推荐指数
1
解决办法
5992
查看次数

用于解决fibonacci的Java 8 Lambda表达式(非递归方式)

我是Java 8中使用Lambda表达式功能的初学者.Lambda表达式在解决Prime数字检查,阶乘等程序方面非常有用.

然而,它们可以有效地用于解决像Fibonacci这样的问题,其中当前值取决于前两个值的总和.我已经很好地使用Lambda表达式有效地解决了素数检查问题.下面给出了相同的代码.

boolean checkPrime=n>1 && LongStream.range(2, (long) Math.sqrt(n)).parallel().noneMatch(e->(n)%e==0);
Run Code Online (Sandbox Code Playgroud)

在方法的上述代码中,noneMatch我们使用范围中的当前值(e)进行评估.但对于Fibonacci问题,我们需要前两个值.

我们怎样才能实现呢?

java lambda functional-programming java-8 java-stream

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

如何从流中获取随机对象

假设我有一个单词列表,我想创建一个方法,将新列表的大小作为参数并返回新列表.如何从原始sourceList中获取随机单词?

public List<String> createList(int listSize) {
   Random rand = new Random();
   List<String> wordList = sourceWords.
      stream().
      limit(listSize).
      collect(Collectors.toList()); 

   return wordList;
}
Run Code Online (Sandbox Code Playgroud)

那么我如何以及在哪里使用我的随机数?

java java-8 java-stream

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

如何使用基于另一个列表的lambda从列表中删除元素

我有文件路径列表:.

List<Path> filePaths; //e.g. [src\test\resources\file\15\54\54_exampleFile.pdf]
Run Code Online (Sandbox Code Playgroud)

54 以上是指文件ID

然后,我获得了一个我的应用程序可以处理Set的StringID,如下所示:

Set<String> acceptedIds = connection.getAcceptedIDs(); //e.g. elements [64, 101, 33]
Run Code Online (Sandbox Code Playgroud)

如何使用Java 8 lambdas来filter排除filePaths其中不包含acceptedIds集合Set中包含的任何可接受的ID的所有元素.

换句话说,我只想保留filePaths具有acceptedIdsset中的id的路径.例如,54不在上面的列表中,因此被删除.

filePaths.stream().filter(...).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

使用Stream从对象列表中查找最常见的属性值

我有两个结构如下的类:

public class Company {
     private List<Person> person;
     ...
     public List<Person> getPerson() {
          return person;
     }
     ...
}

public class Person {
     private String tag;
     ...
     public String getTag() {
          return tag;
     }
     ...
}
Run Code Online (Sandbox Code Playgroud)

基本上,Company类有一个Person对象列表,每个Person对象都可以获得Tag值.

如果我得到Person对象的List,有没有办法使用来自Java 8的Stream来找到所有Person对象中最常见的一个Tag值(如果是平局,可能只是最随机的一个)共同)?

String mostCommonTag;
if(!company.getPerson().isEmpty) {
     mostCommonTag = company.getPerson().stream() //How to do this in Stream?
}
Run Code Online (Sandbox Code Playgroud)

java list java-8 java-stream

20
推荐指数
4
解决办法
2626
查看次数

当数字等于 0 时,如何使用流跳过 limit(number) 调用?

我有一些 Java 代码从items. 它基于以下条件限制它们maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

它工作正常,但问题是:有没有办法跳过限制maxNumber == 0?

我知道我可以这样做:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

但也许有更好的方法,您有什么想法吗?

java java-8 java-stream

20
推荐指数
2
解决办法
667
查看次数

流式传输文件并在读取后移动它们

我想流式传输文件中包含的行,但在处理后将每个文件移动到另一个文件夹。

目前的流程是这样的:

解释:

  1. 我创建Stream的File小号
  2. 我BufferedReader为他们每个人创建一个
  3. 我flatMap到Stream了BufferedReader
  4. 我打印每一行。

代码(为简单起见省略了例外):

(1)    Stream.generate(localFileProvider::getNextFile)
(2)       .map(file -> new BufferedReader(new InputStreamReader(new FileInputStream(file))))
(3)       .flatMap(BufferedReader::lines)
(4)       .map(System.out::println)
          .MOVE_EACH_FILE_FROM_INPUT_FOLDER_TO_SOME_OTHER_FOLDER;
Run Code Online (Sandbox Code Playgroud)

一旦完全读取每个文件并继续处理流中的其他文件,是否可以移动每个文件?

java java-8 java-stream

20
推荐指数
3
解决办法
722
查看次数

加倍流

我想加倍一个Stream(没有DoubleStream).意思是我从流开始并想要获得一个新流,其中旧流的每个元素都流式传输两次.所以1,2,3,4,4,5给了我们1,1,2,2,3,3,4,4,4,4,5,5.有没有这样的流操作?

java java-8 java-stream

19
推荐指数
2
解决办法
865
查看次数