标签: java-stream

在Java 8中以不区分大小写的方式对字符串值进行排序

如何在不区分大小写的顺序中对字符串值进行排序?

List<Employee> listofEmployees = Arrays.asList(
    new Employee(1, "aaa", Arrays.asList(123, 345, 678)),
    new Employee(1, "bbb", Arrays.asList(91011, 121314, 1516117)),
    new Employee(2, "ccc", Arrays.asList(181920, 212223, 242526)),
    new Employee(3, "ddd", Arrays.asList(272829, 303132, 333435)),
    new Employee(4, "BBB", Arrays.asList(29, 332, 33))
);
Run Code Online (Sandbox Code Playgroud)

我写的是这样的:

listofEmployees.stream().sorted(Comparator.comparing(Employee::getName).reversed())
        .forEach(s -> System.out.println(s.getName()));
Run Code Online (Sandbox Code Playgroud)

如何在此处传递字符串不区分大小写的选项?

java java-8 java-stream

21
推荐指数
3
解决办法
8554
查看次数

为什么我不能使用 Stream#toList 在 Java 16 中收集类的接口列表?

我正在流式传输实现接口的类的对象。我想将它们收集为接口的元素列表,而不是实现类。

这对于 Java 16.0.1 的Stream#toList方法似乎是不可能的。例如在下面的代码中,最后一条语句将无法编译。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class WhyDodo {

    private interface Dodo { }

    private static class FancyDodo implements Dodo { }

    public static void main(String[] args) {
        final List<Dodo> dodos = Stream.of(new FancyDodo()).collect(Collectors.toList());
        final List<FancyDodo> fancyDodos = Stream.of(new FancyDodo()).toList();

        final List<Dodo> noFancyDodos = Stream.of(new FancyDodo()).toList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以显式地将每个元素从 转换FancyDodo为Dodo。但至少为了简洁起见,我们也可以使用.collect(Collectors.toList()).

为什么我不能使用 Stream#toList 在 Java 16 中收集类的接口列表?

如果有人有比明确投射更好的解决方案,我也很乐意听到:)

java generics type-inference java-stream java-16

21
推荐指数
3
解决办法
1051
查看次数

递归流

我想使用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
查看次数

终端操作是否关闭了流?

dirPath包含200k文件.我想逐个阅读它们并做一些处理.以下代码片段会导致java.nio.file.FileSystemException: dirPath/file-N Too many open files.终端操作是否forEach()应该在移动到下一个之前关闭开放流(即打开文件)?换句话说,我是否必须为流式文件添加try-with-resources?

Files.list(dirPath)
     .forEach(filePath -> {
              Files.lines(filePath).forEach() { ... }
              });
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream

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

使用Files.lines修改文件

我想读一个文件并用新文本替换一些文本.使用asm和int 21h会很简单,但我想使用新的java 8流.

    Files.write(outf.toPath(), 
        (Iterable<String>)Files.lines(inf)::iterator,
        CREATE, WRITE, TRUNCATE_EXISTING);
Run Code Online (Sandbox Code Playgroud)

在那里的某个地方,我想要一个lines.replace("/*replace me*/","new Code()\n");.新行是因为我想测试在某处插入一段代码.

这是一个游戏示例,它不是我想要的方式,但编译.我只需要一种方法来拦截迭代器中的行,并用代码块替换某些短语.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import static java.nio.file.StandardOpenOption.*;
import java.util.Arrays;
import java.util.stream.Stream;

public class FileStreamTest {

    public static void main(String[] args) {
        String[] ss = new String[]{"hi","pls","help","me"};
        Stream<String> stream = Arrays.stream(ss);

        try {
            Files.write(Paths.get("tmp.txt"),
                    (Iterable<String>)stream::iterator,
                    CREATE, WRITE, TRUNCATE_EXISTING);
        } catch (IOException ex) {}

//// I'd like to hook this next part into Files.write part./////
        //reset stream
        stream = Arrays.stream(ss);
        Iterable<String> it = stream::iterator;
        //I'd like …
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream

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

如何从DirectoryStream创建流

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

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

java java-8 java-stream

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

Java 8 Stream:如何将当前元素与下一个元素进行比较?

如何从List使用Java 8 Streams 获取下一个元素?

如果我迭代a List,我想比较当前与列表的下一个元素.

是否可以使用Java 8 Stream?

java java-8 java-stream

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

如何使用流外部的值使用Java流API创建映射?

我想初始化Map<String, BigDecimal>并希望始终BigDecimal从流外部添加相同的值.

BigDecimal samePrice;
Set<String> set;

set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
Run Code Online (Sandbox Code Playgroud)

但是Java抱怨如下:

收集器类型中的Map(Function,Function)方法不适用于参数(Function,BigDecimal)

为什么我不能从外面使用BigDecimal?如果我写:

set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
Run Code Online (Sandbox Code Playgroud)

它会起作用,但那当然不是我想要的.

java java-8 java-stream collectors

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

如何使用Stream.of只创建一个Stream <String []>?

使用Stream.of创建通用流非常方便,但是如果我想创建一个Stream<String[]>只有一个元素呢?

比方说我有:

String[] tropicalFruits = new String[] {"pineapple", "banana", "mango"};
String[] fruits = new String[] {"melon", "peach", "apple"};
Run Code Online (Sandbox Code Playgroud)

然后Stream.of(tropicalFruits, fruits)产生Stream<String[]>两个元素.如何为单个元素的流实现相同的功能?如果我尝试:

Stream<String[]> fruityStream = Stream.of(tropicalFruits);
Run Code Online (Sandbox Code Playgroud)

我明白了:

错误:不兼容的类型:推理变量T具有不兼容的边界
相等约束:java.lang.String[]
下限:java.lang.String

Stream<String[]> fruityStream = Stream.of(fruits);
                                 ^---------------^
Run Code Online (Sandbox Code Playgroud)

我用Google搜索并搜索了但是我什么也没得到.在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索).

java type-inference variadic-functions java-8 java-stream

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

考虑在过滤流创建后添加的列表元素

给出以下代码:

List<String> strList = new ArrayList<>(Arrays.asList("Java","Python","Php"));

Stream<String> jFilter = strList.stream().filter(str -> str.startsWith("J"));

strList.add("JavaScript"); // element added after filter creation
strList.add("JQuery"); // element added after filter creation

System.out.println(Arrays.toString(jFilter.toArray())); 
Run Code Online (Sandbox Code Playgroud)

哪个输出:

[Java, JavaScript, JQuery]
Run Code Online (Sandbox Code Playgroud)

即使在创建过滤后的流后添加了过滤结果,为什么会出现JavaScript并JQuery显示在过滤结果中?

java java-8 java-stream

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