如何使用 SpEL 提取列表中单个 属性 个对象的列表?
How to extract list of single property of objects in list using SpEL?
我只想要使用 SpEL 的测试器对象列表中的 ID 列表
List<Tester> tests = new ArrayList<Tester>();
tests.add(new Tester(1)); ...
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("tests",tests);
System.out.println(tests.stream().map(Tester::getId).collect(Collectors.toList())); // LIKE THIS
System.out.println(parser.parseExpression("#tests what to write here").getValue(context));
期望的结果:[1, 2, 3, 4]
测试者是
public class Tester {
private Integer id;
}
您可以使用(他们所说的)Collection Projection(在函数式编程世界中也称为 map
):
tests.![id]
这是一种肮脏的方式:
public class ParseCheck {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
List<Tester> tests = Arrays.asList(new Tester(1),new Tester(2),new Tester(3),new Tester(4),new Tester(1));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.registerFunction("stream", ParseCheck.class.getMethod("stream", String.class));
context.setVariable("tests",tests);
System.out.println(tests.stream().map(Tester::getId).distinct().collect(Collectors.toList()));
System.out.println(parser.parseExpression("#tests.stream().map(#stream('id')).distinct().collect(T(java.util.stream.Collectors).toList())").getValue(context));
}
public static Function<Object, Object> stream(String property) {
ExpressionParser parser = new SpelExpressionParser();
return s -> parser.parseExpression(property).getValue(s);
}
}
此处在上下文中注册了一个函数,该函数将 return 需要提取的 属性 流。 属性 也是使用 SpEL 提取的。
我只想要使用 SpEL 的测试器对象列表中的 ID 列表
List<Tester> tests = new ArrayList<Tester>();
tests.add(new Tester(1)); ...
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("tests",tests);
System.out.println(tests.stream().map(Tester::getId).collect(Collectors.toList())); // LIKE THIS
System.out.println(parser.parseExpression("#tests what to write here").getValue(context));
期望的结果:[1, 2, 3, 4]
测试者是
public class Tester {
private Integer id;
}
您可以使用(他们所说的)Collection Projection(在函数式编程世界中也称为 map
):
tests.![id]
这是一种肮脏的方式:
public class ParseCheck {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
List<Tester> tests = Arrays.asList(new Tester(1),new Tester(2),new Tester(3),new Tester(4),new Tester(1));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.registerFunction("stream", ParseCheck.class.getMethod("stream", String.class));
context.setVariable("tests",tests);
System.out.println(tests.stream().map(Tester::getId).distinct().collect(Collectors.toList()));
System.out.println(parser.parseExpression("#tests.stream().map(#stream('id')).distinct().collect(T(java.util.stream.Collectors).toList())").getValue(context));
}
public static Function<Object, Object> stream(String property) {
ExpressionParser parser = new SpelExpressionParser();
return s -> parser.parseExpression(property).getValue(s);
}
}
此处在上下文中注册了一个函数,该函数将 return 需要提取的 属性 流。 属性 也是使用 SpEL 提取的。