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

我正在尝试将我创建的循环转换为Java流,尽管代码使用了
迭代器
,我发现很难将其转换为可读代码

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文件的链接