Java迭代器和流
我正在尝试将我创建的循环转换为Java流,尽管代码使用了Java迭代器和流,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试将我创建的循环转换为Java流,尽管代码使用了迭代器,我发现很难将其转换为可读代码 private void printKeys() throws IOException { ClassLoader classLoader = getClass().getClassLoader(); // read a json file ObjectMapper objectMapper = new ObjectMapper(); JsonNode root = o
迭代器
,我发现很难将其转换为可读代码
private void printKeys() throws IOException {
ClassLoader classLoader = getClass().getClassLoader();
// read a json file
ObjectMapper objectMapper = new ObjectMapper();
JsonNode root = objectMapper.readTree(classLoader.getResource("AllSets.json"));
Set<String> names = new HashSet<>();
// loop through each sub node and store the keys
for (JsonNode node : root) {
for (JsonNode cards : node.get("cards")) {
Iterator<String> i = cards.fieldNames();
while(i.hasNext()){
String name = i.next();
names.add(name);
}
}
}
// print each value
for (String name : names) {
System.out.println(name);
}
}
private void printKeys()引发IOException{
ClassLoader ClassLoader=getClass().getClassLoader();
//读取json文件
ObjectMapper ObjectMapper=新的ObjectMapper();
JsonNode root=objectMapper.readTree(classLoader.getResource(“allset.json”);
Set name=新的HashSet();
//循环遍历每个子节点并存储密钥
for(JsonNode节点:根){
对于(JsonNode卡片:node.get(“卡片”)){
迭代器i=cards.fieldNames();
while(i.hasNext()){
字符串名称=i.next();
名称。添加(名称);
}
}
}
//打印每个值
for(字符串名称:名称){
System.out.println(名称);
}
}
我已经尝试了以下方法,尽管我觉得这不是正确的方法
List<JsonNode> nodes = new ArrayList<>();
root.iterator().forEachRemaining(nodes::add);
Set<JsonNode> cards = new HashSet<>();
nodes.stream().map(node -> node.get("cards")).forEach(cards::add);
Stream s = StreamSupport.stream(cards.spliterator(), false);
//.. unfinished and unhappy
List nodes=new ArrayList();
root.iterator().forEachRemaining(nodes::add);
Set cards=新HashSet();
nodes.stream().map(节点->节点.get(“卡片”)).forEach(卡片::添加);
streams=StreamSupport.Stream(cards.spliterator(),false);
//.. 未竟
您可以在这里找到我使用的Json文件:
请注意,它相当大。如果您向我们提供“json”文件,它将非常有用 至少现在,我可以给你一些建议:
Set<JsonNode> cards = new HashSet<>();
nodes.stream().map(node -> node.get("cards")).forEach(cards::add);
替换为:
Set<JsonNode> cards = nodes.stream().map(node -> node.get("cards")).collect(Collectors.toSet());
names.forEach(System.out::println);
如果您向我们提供“json”文件,它将非常有用 至少现在,我可以给你一些建议:
Set<JsonNode> cards = new HashSet<>();
nodes.stream().map(node -> node.get("cards")).forEach(cards::add);
替换为:
Set<JsonNode> cards = nodes.stream().map(node -> node.get("cards")).collect(Collectors.toSet());
names.forEach(System.out::println);
替换
Set<JsonNode> cards = new HashSet<>();
然后添加以下行
cards.stream().forEach( card -> {
Iterable<String> iterable = () -> card.fieldNames();
Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);
targetStream.forEach(names::add);
});
names.forEach(System.out::println);
cards.stream().forEach(卡->{
Iterable Iterable=()->card.fieldNames();
Stream targetStream=StreamSupport.Stream(iterable.spliterator(),false);
forEach(名称::add);
});
name.forEach(System.out::println);
更换
Set<JsonNode> cards = new HashSet<>();
然后添加以下行
cards.stream().forEach( card -> {
Iterable<String> iterable = () -> card.fieldNames();
Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);
targetStream.forEach(names::add);
});
names.forEach(System.out::println);
cards.stream().forEach(卡->{
Iterable Iterable=()->card.fieldNames();
Stream targetStream=StreamSupport.Stream(iterable.spliterator(),false);
forEach(名称::add);
});
name.forEach(System.out::println);
您可以一次性完成大部分工作,但遗憾的是,此json不能更好地支持流
List<JsonNode> nodes = new ArrayList<>();
root.iterator().forEachRemaining(nodes::add);
Set<String> names = nodes.stream()
.flatMap(node -> StreamSupport.stream(
node.get("cards").spliterator(), false))
.flatMap(node -> StreamSupport.stream(
((Iterable<String>) () -> node.fieldNames()).spliterator(), false))
.collect(Collectors.toSet());
您可以一次性完成大部分工作,但遗憾的是,这个json不能更好地支持流
List<JsonNode> nodes = new ArrayList<>();
root.iterator().forEachRemaining(nodes::add);
Set<String> names = nodes.stream()
.flatMap(node -> StreamSupport.stream(
node.get("cards").spliterator(), false))
.flatMap(node -> StreamSupport.stream(
((Iterable<String>) () -> node.fieldNames()).spliterator(), false))
.collect(Collectors.toSet());
请将
AllSets.json
附加到测试代码中,好吗?@Andriabramov我在问题中添加了一个指向该文件的链接。请将AllSets.json
附加到测试代码中好吗?@Andriabramov我在问题中添加了指向该文件的链接。使用辅助方法公共静态流(Iterable-itor)可以看起来更好{return StreamSupport.stream(itor.spliterator(),false);}
使用助手方法公共静态流流(Iterable itor){return StreamSupport.stream(itor.spliterator(),false);}
在原始问题中添加了指向json文件的链接在原始问题中添加了指向json文件的链接