使用Java8模式匹配将映射转换为列表
我需要将这些员工的密钥存储到一个新的使用Java8模式匹配将映射转换为列表,java,regex,dictionary,java-8,java-stream,Java,Regex,Dictionary,Java 8,Java Stream,我需要将这些员工的密钥存储到一个新的列表,下面给出了代码,我可以通过正常的迭代来完成 我可以使用java8模式匹配,使用collect和filter等进行匹配吗 public static void main(String[] args) { List<EmpData> lst1 = new ArrayList<EmpData>(); List<EmpData> lst2 = new ArrayList<EmpData>();
列表,下面给出了代码,我可以通过正常的迭代来完成
我可以使用java8模式匹配,使用collect
和filter
等进行匹配吗
public static void main(String[] args) {
List<EmpData> lst1 = new ArrayList<EmpData>();
List<EmpData> lst2 = new ArrayList<EmpData>();
EmpData obj1=new EmpData("100", "Name1", "25/05/1979");
EmpData obj2=new EmpData("101", "Name2", "25/05/1975");
EmpData obj3=new EmpData("103", "Name3", "25/05/1976");
lst1.add(obj1);
lst1.add(obj2);
lst2.add(obj3);
HashMap<String, List<EmpData>> map = new HashMap<>();
map.put("Address1Emp1", lst1);
map.put("Address2Emp2", lst2);
List<EmpData> listEmp = new ArrayList<>();
//Need to store those employees key matching Address1 to a List<EmpData>
}
publicstaticvoidmain(字符串[]args){
List lst1=new ArrayList();
List lst2=新的ArrayList();
EmpData obj1=新的EmpData(“100”、“名称1”、“25/05/1979”);
EmpData obj2=新的EmpData(“101”、“名称2”、“25/05/1975”);
EmpData obj3=新的EmpData(“103”、“名称3”、“25/05/1976”);
lst1.添加(obj1);
lst1.添加(obj2);
lst2.添加(obj3);
HashMap=newHashMap();
地图放置(“地址1MP1”,lst1);
地图放置(“地址2EMP2”,lst2);
List listEmp=new ArrayList();
//需要将与Address1匹配的员工密钥存储到列表中
}
我猜您指的是来自java-8的流和要求,即密钥必须匹配“Address1Emp.*”
regex
您可以使用以下代码:
map.entrySet().stream() // create a stream of entries
.filter(e -> e.getKey().matches("Address1Emp.*")) // leave only those entries, whose keys start with "Address1"
.map(Map.Entry::getValue) // get values only
.collect(Collectors.toList());
添加内部列表后进行编辑:
map.entrySet().stream() // create a stream of entries
.filter(e -> e.getKey().matches("Address1Emp.*")) // leave only those entries, whose keys start with "Address1"
.flatMap(e -> e.getValue().stream()) // get values only
.collect(Collectors.toList());
根据您需要的模式,您可以使用startsWith
List<EmpData> listEmp = map.entrySet().stream()
.filter(e -> e.getKey().startsWith("Address1"))
.map(Entry::getValue)
.collect(Collectors.toList());
java8没有名为模式匹配的功能,可能您是指java.util.stream?您的代码中存在类型检查问题,映射的值类型是List
,但您放入映射的是EmpData
。是@jizhilong,使用stream.@Vinod.T.V请提供一个编译器示例代码不会为行map.put编译(“地址1MP1”,新EmpData(“100”、“名称1”、“25/05/1979”)
如果它的类型是Map Map
这个正则表达式并不适用于所有情况。你应该检查Address1Emp.*
因为你也包括Address11EmpX
@jdickel这样的条目,虽然我不是100%确定OP想要的,但你很可能是对的。非常感谢!这将给出我需要合并所有Map的列表通过改变sugestion@Andronicus@Vinod.T.V,可以将值转换为单个列表吗?这如何生成嵌套的列表
?您将EmpData
作为一个值。如果您是说,映射将列表
作为值类型,那么您的示例是不一致的(不提编译器)@vinod这足以让你回答你原来的问题。如果你不能解决问题,你应该试着自己将你的列表展平,并问一个单独的问题。这有助于保持问题的重点,并对其他人更有用。请参阅感谢@htmoia最后我需要将所有地图值合并到一个列表中,我在这里面临挑战。
List<EmpData> listEmp = map.entrySet().stream()
.filter(e -> e.getKey().contains("Address1"))
.map(Entry::getValue)
.collect(Collectors.toList());