2017-09-29 1 views
0

저는 자바 람다 표현식에 익숙하지 않아서 제가 무엇을 요구하는지 정확하게 알지 못합니다. 가능하지 않은 경우 더 나은 방법을 제안하십시오. 내가 문자열 목록에이 개체를 변환 할 필요가람다를 사용하여 객체 필드를 목록으로 만들기

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()); 
} 

람다 식을 사용하여이 작업을 수행 할 수 있습니까?

대출에는 더 많은 필드가 있습니다. 나는 필드 수에 관계없이리스트를 얻을 수있는 표현을 원합니다.

+0

아마 반사와 함께 작동 할 수 있습니다. 다른 방법은 당신의 객체를위한 커스텀'toString' 메쏘드를 생성 한 다음 올바르게 분리해야한다는 것입니다. 어떤 필드가 변경되면 tostring 메서드 만 변경하면되므로 일종의 일반적인 방법이 될 것입니다. – XtremeBaumer

+0

정확히 달성하려는 것은 무엇입니까? 이것은 매우 깨끗한 디자인으로 보이지 않습니다. – daniu

+0

대출 오브젝트를 나중에 다양한 용도로 사용되는 목록으로 변환해야합니다. 이렇게하려면 매우 엄격한'getListFromLoan'을 사용하여 객체를 변환합니다. 나중에 하나 이상의 필드가 Loan 클래스에 추가되면이 함수를 변경해야합니다. 나는 그것을하고 싶지 않다. 멤버 필드 수에 관계없이 목록으로 변환 할 수있는 함수가 필요합니다. –

답변

2

lambda function은 하나의 기능입니다. 정기적 인 방법으로 필요한 것을 할 수 있습니까?

당신이 말한 것을 성취하려는 경우 (클래스에 몇 개의 속성이 있더라도 모든 것을 목록에 추가하는 방법) 직접 추가하거나 추가 할 때마다 업데이트해야합니다. (물론 그들이 할 수 있지만, 내가 바로 당신을 이해하면 당신은 기대하지 무엇을) 자바 8 마법을하지

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
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); 
    } 
} 
0

람다 표현식 : 속성을 제거하거나이 같은 reflection

뭔가를 사용합니다.

람다 식은 익명의 클래스에 대한 대체물로서, 함수 (pre java 8 개 구문의 메소드)를 구현하기 위해 클래스에서 래핑 할 필요가 없다는 이점이 있습니다. 더 나은 이해를 위해서는 "행동 매개 변수화"를 찾아보십시오.

jdk에서 제공하는 "Function"기능 인터페이스를 사용할 수 있다고합니다. 하나의 인수를 허용하고 결과를 생성하는 함수를 나타냅니다. 그래서 당신은 방법을

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; 
} 

를 호출합니다.