如何在不区分大小写的顺序中对字符串值进行排序?
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 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 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或外部库的解决方案不感兴趣.
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) 我想读一个文件并用新文本替换一些文本.使用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) 在阅读API时,DirectoryStream我错过了很多功能.首先,它建议使用for循环从流到List.我想念它DirectoryStream不是一个事实Stream.
我怎样才能让一个Stream<Path>从DirectoryStreamJava中8?
如何从List使用Java 8 Streams 获取下一个元素?
如果我迭代a List,我想比较当前与列表的下一个元素.
是否可以使用Java 8 Stream?
我想初始化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)
它会起作用,但那当然不是我想要的.
使用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.StringRun Code Online (Sandbox Code Playgroud)Stream<String[]> fruityStream = Stream.of(fruits); ^---------------^
我用Google搜索并搜索了但是我什么也没得到.在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索).
给出以下代码:
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显示在过滤结果中?