使用lambda将Object字段设置为列表

时间:2017-09-29 06:24:27

标签: java arraylist lambda

我是java lambda表达式的新手,所以我不确切知道我问的是否可行。如果不可能,请提出更好的方法,如果有的话。

我有一个类Object,例如:

class Loan {
   private String customerId;
   private Integer tenure;
   private Double amount;
   ...
}

我需要将此对象转换为字符串列表。我现在正在做的方式是:

List<String> loanAsList = getListFromLoan(loan);

public List<String> getListFromLoan(Loan loan) {
    List<String> loanAsList = new ArrayList<>();
    loanAsList.add(loan.getCustomerId());
    loanAsList.add(Integer.toString(loan.getTenure());
    loanAsList.add(Double.toString(loan.getAmount());
}

可以使用lambda表达式完成吗?

贷款还有很多我只展示过的领域。我想要一个表达式,其中无论字段的数量我都可以获得List。

3 个答案:

答案 0 :(得分:2)

Object someObject = getItSomehow();
for (Field field : someObject.getClass().getDeclaredFields()) {
    field.setAccessible(true); // You might want to set modifier to public first.
    Object value = field.get(someObject); 
    if (value != null) {
        System.out.println(field.getName() + "=" + value);
    }
}

答案 1 :(得分:2)

lambda function只是一个功能。你能用常规方法做你需要的吗?

如果你想实现你所说的(一种方法,无论你的课程有多少属性,将它们全部添加到列表中),你需要手动完成它并在每次添加时更新它/删除属性或使用reflection

这样的事情:

Loan loan = ...
List<String> loanAsList = new ArrayList<>();
for (Field f : loan.getClass().getDeclaredFields()) {
    field.setAccessible(true);
    Object value = field.get(loan); 
    loanAsList.add(value.toString());
}

答案 2 :(得分:0)

Lambda Expressions在Java 8中不做魔术(如果我理解你的话,他们会做但不是你期望的那样)。

将lambda表达式视为匿名类的替代,其优点是您不需要将它包装在类中,因为它实现了一个函数(前java 8术语中的方法)。查找&#34;行为参数化&#34;为了更好地理解。

说你可以使用&#34; Function&#34;功能界面由jdk提供。表示接受一个参数并生成结果的函数。所以你可以写一个方法

public List<String> getListOfAttributes(Loan loan, Function<Loan, List<String>> myFunction) {
return myFunction.apply(loan);
}

然后调用此方法

getListOfAttributes(loan, (loan) -> {
    List<String> loanAsList = new ArrayList();
    loanAsList.add(loan.getCustomerId());
    loanAsList.add(Integer.toString(loan.getTenure());
    loanAsList.add(Double.toString(loan.getAmount());
    return loanAsList;
}

因为&#34;行为参数化&#34;你可以传递不同的功能来获得不同的List。