728x90
반응형
내 코드 바꿔보기, 근데 함수형을 곁들인 시리즈
함수형 프로그래밍을 조금씩 이름만 듣고 검색만 해보다 이제 회사 코드에 적용을 해보고 있다. 틈틈이 기존 코드 스타일을 함수형 프로그래밍으로 바꾸는 방법을 올려보려고 한다.
간단하게. 최대한 간단하게 올리려고 한다.
시간이 된다면 함수형 프로그래밍의 패러다임과 구조를 정리해서 올려봐야겠다.
우선 다음 코드와 같이 Person이라는 클래스를 정의합니다.
public class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public int getAge(){
return this.age;
}
public String getName(){
return this.name;
}
}
이름과 나이를 필드로 가지고 있습니다.
2명의 Peter, 1명의 John을 관리하도록 합니다.
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Peter", 24);
Person p2 = new Person("John", 25);
Person p3 = new Person("Peter", 15);
List<Person> personList = new ArrayList<>();
personList.add(p1);
personList.add(p2);
personList.add(p3);
}
}
노 함수형 방식
우리가 함수형 프로그래밍을 모르는 상태에서 특정 나이인 사람을 구하기 위해서는 어떻게 작성했을까요.
다양한 방법이 있겠지만 아마 대부분 이렇게 작성했을 것이라 생각됩니다.
public static List<Person> getPersonByAgeUsingIfStatement(List<Person> personList, int age){
List<Person> resultPersonList = new ArrayList<>();
for(Person person : personList){
if(person.getAge() == age){
resultPersonList.add(person);
}
}
return resultPersonList;
}
나쁘지 않습니다. 데이터를 받아서 특정 값과 일치하는 인스턴스는 List에 넣어주고 반환합니다.
함수형 방식
이제 이 코드를 함수형 프로그래밍을 곁들여 단 한줄로 줄여보겠습니다.
public static List<Person> getPersonByAgeUsingStream(List<Person> personList, int age){
return personList.stream().filter(person -> person.getAge() == age).collect(Collectors.toList());
}
뭔가 상당히 가로로 길어졌습니다. 순서대로 읽어보겠습니다.
"personList에서 stream이란걸 사용해서 filter를 적용했는데 person인스턴스의 나이가 조건과 맞는 것들만 골라서 반환을 할 건데 반환하는 형식은 Collectors의 toList의 반환형으로 할 거야"
무슨 말인지는 대충 알 것 같은데 각 함수의 역할을 조금 더 자세히 살펴봅시다.
- 자바에서 함수형 프로그래밍을 하기 위해서는 stream을 오픈해야 합니다.
- personList.stream()으로 오픈합니다.
- 이후 filter를 통해 내가 원하는 조건으로 검색을 해야 합니다.
- "person -> "을 이용해 각 인스턴스를 하나씩 꺼내면서 "->" 다음에 원하는 조건을 입력합니다.
- 이후 collect를 통해 원하는 반환형을 지정합니다. List로 반환하기 위해 Collectors.toList()를 입력했습니다.
이걸 응용해보고 싶으신 분들은 각 인스턴스의 name값으로 검색해보는 것을 작성해보셔도 좋을 것 같습니다.
public class Main {
public static List<Person> getPersonByAgeUsingIfStatement(List<Person> personList, int age){
List<Person> resultPersonList = new ArrayList<>();
for(Person person : personList){
if(person.getAge() == age){
resultPersonList.add(person);
}
}
return resultPersonList;
}
public static List<Person> getPersonByAgeUsingStream(List<Person> personList, int age){
return personList.stream().filter(person -> person.getAge() == age).collect(Collectors.toList());
}
public static void main(String[] args) {
Person p1 = new Person("Peter", 24);
Person p2 = new Person("John", 25);
Person p3 = new Person("Peter", 15);
List<Person> personList = new ArrayList<>();
personList.add(p1);
personList.add(p2);
personList.add(p3);
List<Person> streamResultPersonList = getPersonByAgeUsingStream(personList, 24);
for(Person person : streamResultPersonList){
System.out.println(person.getName());
System.out.println(person.getAge());
}
List<Person> ifStatementResultPersonList = getPersonByAgeUsingIfStatement(personList, 24);
for(Person person : ifStatementResultPersonList){
System.out.println(person.getName());
System.out.println(person.getAge());
}
}
}
728x90
반응형
'JAVA' 카테고리의 다른 글
Annotation과 동작 원리 (0) | 2023.01.24 |
---|---|
f-lab 백엔드 면접 질문 답해보기(아직 만드는 중) (2) | 2022.12.01 |
자바 조금 더 잘 사용해보자 (1) (0) | 2022.03.03 |
짤막한 개발 메모 - watchdog (0) | 2021.11.23 |
자바 인터뷰 질문 - 심화(1) (0) | 2021.07.16 |