【发布时间】:2026-02-05 21:25:01
【问题描述】:
我想使用 Java 8 流将字符串值列表转换为单个字符串。像“A”、“B”这样的值列表应该返回像“Values: 'A', 'B' added”这样的字符串。这很好用,但是我想根据值的数量更改 Pre- 和 Postfix。例如,如果我有一个只有“A”的列表,我希望得到的字符串是“添加了值 'A'”。
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
public class HelloWorld
{
public static void main(String[] args)
{
List<String> values = new ArrayList<>();
values.add("A");
values.add("B");
values.add("C");
List<String> value = new ArrayList<>();
value.add("A");
System.out.println(log(values));
System.out.println(log(value));
}
public static String log(List<String> values){
return values.stream()
//.filter(...)
.map(x -> "'" + x + "'")
.collect(Collectors.joining(",","values:"," added"));
}
}
有没有办法根据结果列表的大小更改 Collctor?然后我可以做类似的事情
.collect(Collectors.joining(",", size = 1 ? "Value " : "Values: "," added"));
我更喜欢没有中间 List 结果的单个流操作。我事先也不知道结果,因为我过滤了流。
编辑:我最终使用了尤金的建议。我想做的是找到两个列表之间的差异,并以人类可读的形式返回差异。效果很好!
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
public class HelloWorld
{
public static void main(String[] args)
{
List<String> oldValues = new ArrayList<>();
oldValues.add("A");
oldValues.add("B");
oldValues.add("C");
List<String> newValues = new ArrayList<>();
newValues.add("A");
newValues.add("C");
newValues.add("D");
newValues.add("E");
System.out.println(HelloWorld.<String>log(oldValues, newValues, " deleted"));
System.out.println(HelloWorld.<String>log(newValues, oldValues, " added"));
}
public static <T> String log(List<T> first, List<T> second, String postfix) {
return (String) first
.stream()
.filter(x -> !second.contains(x))
.map(x -> "'" + x.toString() + "'").
collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
if (list.size() == 1) {
return "Value " + list.get(0) + postfix;
}
if (list.size() > 1) {
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(object.toString());
}
return "Values: " + String.join(",", strings) + postfix;
}
return "";
}));
}
}
输出:
Value 'B' deleted
Values: 'D','E' added
【问题讨论】:
标签: java java-stream collectors