将对象属性列表加入String
我现在正在学习lambda,我想知道如何用lambda的单行编写这段代码。
我有一个Person
类,其中包含ID
和name
字段
目前,我有一个List
存储这些Person
对象。 我想要完成的是获取一个由人的id组成的字符串。
“id1,id2,id3” 。
我怎样才能用lambda实现这个目标?
要检索由分隔符","
分隔的所有ID组成的String
","
首先必须将Person
ID map
到新流,然后可以应用Collectors.joining
。
String result = personList.stream().map(Person::getId) .collect(Collectors.joining(","));
如果您的ID字段不是String
而是int
或其他原始数字类型,那么您应该使用以下解决方案:
String result = personList.stream().map(p -> String.valueOf(p.getId())) .collect(Collectors.joining(","));
流映射,并收集列表!
List myListofPersons = personList.stream() .map(Person::getId) .collect(Collectors.toList());
如果你需要在String对象中,那么加入列表
String res = String.join(" , ", myListStringId); System.out.println(res);
稍微过度设计,但有助于更频繁地发生此问题(特别是如果使用默认映射器和分隔符添加委托给此方法的重载方法):
/** * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression. * @return a list of the values' string representation according to
mapper
, separated by the specified * string. Null if list is null or empty. */ public staticString toListString(Collection list, String separator, Function super R, ? extends String> mapper) { if (list == null || list.isEmpty()) { return null; } return list.stream() .map(mapper) .collect(Collectors.joining(separator)); }
和适当的反函数:
/** * @param list a list of values, separated by the specified separator * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression. * @param mapper the function to map a single string to a value. * @return a list of the values. Empty if string is null or empty. */ public static List fromListString(String list, String separator, Function super String, ? extends R> mapper) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } return Arrays.stream(list.trim().split(separator)) .map(mapper) .collect(Collectors.toCollection(ArrayList::new)); }
如果性能是一个问题,我会选择经典的循环方法:
StringBuilder s = new StringBuilder(); for(R r : list){ if (s.length() != 0) s.append(separator); s.append(mapper.apply(r)); } return s.toString();
和:
List result = new ArrayList<>(); for (String s : list.trim().split(separator)){ result.add(mapper.apply(s)); } return result;
您还可以使用Collectors#mapping如下:
String ids = personList.stream().collect(mapping(Person::getId , Collectors.joining(",")));
或者 Person.ID
不是CharSequence
的实例,那么你需要双映射如下:
String ids = personList.stream().collect(mapping(Person::getId , mapping(String::valueOf , Collectors.joining(","))));