Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用映射和过滤器获取嵌套的筛选列表?_Java_Filter_Java 8_Java Stream - Fatal编程技术网

Java 如何使用映射和过滤器获取嵌套的筛选列表?

Java 如何使用映射和过滤器获取嵌套的筛选列表?,java,filter,java-8,java-stream,Java,Filter,Java 8,Java Stream,我是Java的新手,用stream学习Java8。 我想过滤列表。 我需要筛选列表,嵌套列表为22。 但我正在努力做到这一点。有人救我吗 我在下面放了一些简单的代码。 我试过下面这样,但它现在工作 List<Custom> list = new ArrayList<>(); list.stream().map( x -> x.getNestedList.stream().filter( y->y.getValue.equals("22")

我是Java的新手,用stream学习Java8。 我想过滤列表。 我需要筛选列表,嵌套列表为22。 但我正在努力做到这一点。有人救我吗

我在下面放了一些简单的代码。 我试过下面这样,但它现在工作


List<Custom> list = new ArrayList<>();
list.stream().map(
  x -> x.getNestedList.stream().filter(
       y->y.getValue.equals("22")
  )
)


Before
[
  {
   "a":"1",
   "nestedlist": [ {"11"},
                   {"22"},
                   {"33"} ]
  },
  {
   "a":"2",
   "nestedlist": [ {"22"}, 
                   {"44"} ]
  },
  {  
   "a":"3",
   "nestedlist": [ {"11"}, 
                   {"33"} ]
  },
  {
   "a":"4",
   "nestedlist": [ {"b":"11"} ]
  }
]



After 
(Nestedlist has filtered by "22", but parent list still has whole element)
[
  {
   "a":"1",
   "nestedlist": [ {"22"}]
  },
  {
   "a":"2",
   "nestedlist": [ {"22"} ]
  },
  {  
   "a":"3",
   "nestedlist": [  ]
  },
  {
   "a":"4",
   "nestedlist": [  ]
  }
]

我有一些应该接近解决方案的东西,但是没有nestedList的定义,它只是一个草稿。您必须根据您的代码对其进行调整

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Scratch {
   static class Custom<T>{
       String a;
       List<T> nestedList;

       public Custom(String a, List<T> nestedList) {
           this.a = a;
           this.nestedList = nestedList;
       }

       public Custom(String a, T... nestedList) {
           this.a = a;
           this.nestedList = Arrays.asList(nestedList);
       }

       public String getA() {
           return a;
       }

       public void setA(String a) {
           this.a = a;
       }

       public List<T> getNestedList() {
           return nestedList;
       }

       public void setNestedList(List<T> nestedList) {
           this.nestedList = nestedList;
       }

       @Override
       public String toString() {
           return "Custom{" +
                   "a='" + a + '\'' +
                   ", nestedList=" + nestedList +
                   '}' +
                   '\n';
       }
   }



   public static void main(String... args){
       List<Custom> list = new ArrayList<>();
       list.add(new Custom<String>("1", "11", "22", "33"));
       list.add(new Custom<String>("2", "22", "44"));
       list.add(new Custom<String>("3", "11", "33"));

       List result = list.stream().map(
               x -> new Custom(x.getA(), x.getNestedList().stream().filter(y -> y.equals("22")).collect(Collectors.toList()))
       ).collect(Collectors.toList());

       System.out.println("input: "+list);
       System.out.println("result: "+result);
    }


}

如果我理解了您试图正确执行的操作,那么代码的主要问题是您是否将初始自定义对象映射到nestedList的内容流,我绝对不能确定这一点。您需要做的是,将一个自定义映射到一个新的更新的自定义(我所做的),或者更新现有的自定义,因此需要一个forEach或基本循环而不是映射的现有列表

是否要修改原始数据结构中的值,或者生成并返回已筛选的副本?请澄清您希望输出的外观。这无关紧要。马英九的新名单会更好case@Randy你能分享自定义类的定义吗?
input: [Custom{a='1', nestedList=[11, 22, 33]}
, Custom{a='2', nestedList=[22, 44]}
, Custom{a='3', nestedList=[11, 33]}
]
result: [Custom{a='1', nestedList=[[22]]}
, Custom{a='2', nestedList=[[22]]}
, Custom{a='3', nestedList=[[]]}
]