Java 使用lambda将对象字段设置为列表

Java 使用lambda将对象字段设置为列表,java,arraylist,lambda,Java,Arraylist,Lambda,我不熟悉java lambda表达式,所以我不知道我所问的是否可能。如果不可能,请建议更好的方法 我有一个类对象,例如: class Loan { private String customerId; private Integer tenure; private Double amount; ... } 我需要将此对象转换为字符串列表。我现在的做法是: List<String> loanAsList = getListFromLoan(loan); pu

我不熟悉java lambda表达式,所以我不知道我所问的是否可能。如果不可能,请建议更好的方法

我有一个类对象,例如:

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());
}
List loanAsList=getListFromLoan(贷款);
公共列表getListFromLoan(贷款){
List loanAsList=新建ArrayList();
loanAsList.add(loan.getCustomerId());
add(Integer.toString(loan.getTenure());
loanAsList.add(Double.toString(loan.getAmount());
}
这可以使用lambda表达式来完成吗

Loan还有很多字段,我只展示了几个。我想要一个表达式,在其中无论字段的数量如何,我都可以得到一个列表。

a只是一个函数。你能用常规方法做你需要的吗

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);
    }
}
如果您想要实现您所说的(一种方法,无论您的类有多少个属性,都会将它们全部添加到一个列表中),您需要手动执行此操作,并在每次添加/删除属性或使用时对其进行更新

大概是这样的:

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());
}
贷款=。。。
List loanAsList=新建ArrayList();
对于(字段f:loan.getClass().getDeclaredFields()){
字段。setAccessible(true);
对象值=field.get(贷款);
loanAsList.add(value.toString());
}
A只是一个函数。你能用常规方法做你需要的吗

如果您想要实现您所说的(一种方法,无论您的类有多少个属性,都会将它们全部添加到一个列表中),您需要手动执行此操作,并在每次添加/删除属性或使用时对其进行更新

大概是这样的:

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());
}
贷款=。。。
List loanAsList=新建ArrayList();
对于(字段f:loan.getClass().getDeclaredFields()){
字段。setAccessible(true);
对象值=field.get(贷款);
loanAsList.add(value.toString());
}

Lambda表达式在Java8中并没有神奇的作用(它们确实如此,但如果我理解正确的话,它们并不是您所期望的)

将lambda表达式视为匿名类的替代方法,其优点是不需要将其封装在类中,因为它可以实现一个函数(java 8之前术语中的方法)。查阅“行为参数化”可以更好地理解

表示您可以使用jdk提供的“”函数接口。表示接受一个参数并生成结果的函数。因此您可以编写一个方法

public List<String> getListOfAttributes(Loan loan, Function<Loan, List<String>> myFunction) {
return myFunction.apply(loan);
}
public List getListofAttribute(贷款,函数myFunction){
返回myFunction.apply(贷款);
}
然后调用这个方法

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;
}
getListOfAttributes(loan,(loan)->{
List loanAsList=新建ArrayList();
loanAsList.add(loan.getCustomerId());
add(Integer.toString(loan.getTenure());
loanAsList.add(Double.toString(loan.getAmount());
归还贷款清单;
}

因此,由于“行为参数化”,您可以传递不同的功能以获得不同的列表。

Lambda表达式在Java 8中并没有神奇的作用(它们确实如此,但如果我理解正确的话,它们并不是您所期望的)

将lambda表达式视为匿名类的替代方法,其优点是不需要将其封装在类中,因为它可以实现一个函数(java 8之前术语中的方法)。查阅“行为参数化”可以更好地理解

表示您可以使用jdk提供的“”函数接口。表示接受一个参数并生成结果的函数。因此您可以编写一个方法

public List<String> getListOfAttributes(Loan loan, Function<Loan, List<String>> myFunction) {
return myFunction.apply(loan);
}
public List getListofAttribute(贷款,函数myFunction){
返回myFunction.apply(贷款);
}
然后调用这个方法

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;
}
getListOfAttributes(loan,(loan)->{
List loanAsList=新建ArrayList();
loanAsList.add(loan.getCustomerId());
add(Integer.toString(loan.getTenure());
loanAsList.add(Double.toString(loan.getAmount());
归还贷款清单;
}

因为“行为参数化”您可以传入不同的功能以获得不同的列表。

也许它可以与反射一起工作。另一种方法是为您的对象创建一个自定义的
toString
方法,然后您必须正确地拆分它。这是一种通用的方法,因为如果任何字段更改了确切的值,您只需更改toString方法您试图实现的目标是什么?这似乎不是一个非常干净的设计。我需要将loan对象转换为一个列表,稍后用于各种用途。为此,我使用非常严格的
getListFromLoan
转换对象。如果稍后将一个或多个字段添加到loan类中,则需要更改此函数。我不知道I don’我不想这样做。我想要一个函数,它可以转换成一个列表,而不考虑成员字段的数量。它可能与反射一起工作。另一种方法是为对象创建一个自定义的
toString
方法,然后你必须正确地拆分它。这是一种通用的方法,因为你只需要更改toString如果任何字段发生变化,您到底想实现什么?这似乎不是一个非常干净的设计。我需要将loan对象转换为一个列表,稍后用于各种用途。为此,我使用非常严格的
getListFromLoan
转换对象。如果稍后将一个或多个字段添加到loan类中,则本例中nction需要更改。我不想这样做。我想要一个可以转换为列表的函数,而不考虑成员字段的数量