我想使用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或外部库的解决方案不感兴趣.
在阅读API时,DirectoryStream我错过了很多功能.首先,它建议使用for循环从流到List.我想念它DirectoryStream不是一个事实Stream.
我怎样才能让一个Stream<Path>从DirectoryStreamJava中8?
我有要并行处理的元素集合.当我使用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 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问题,我们需要前两个值.
我们怎样才能实现呢?
假设我有一个单词列表,我想创建一个方法,将新列表的大小作为参数并返回新列表.如何从原始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)
那么我如何以及在哪里使用我的随机数?
我有文件路径列表:.
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) 我有两个结构如下的类:
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 代码从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)
但也许有更好的方法,您有什么想法吗?
我想流式传输文件中包含的行,但在处理后将每个文件移动到另一个文件夹。
目前的流程是这样的:
解释:
Stream的File小号BufferedReader为他们每个人创建一个flatMap到Stream了BufferedReader代码(为简单起见省略了例外):
(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)
一旦完全读取每个文件并继续处理流中的其他文件,是否可以移动每个文件?
我想加倍一个Stream(没有DoubleStream).意思是我从流开始并想要获得一个新流,其中旧流的每个元素都流式传输两次.所以1,2,3,4,4,5给了我们1,1,2,2,3,3,4,4,4,4,5,5.有没有这样的流操作?