1. 람다식


  • (파라미터1, 파라미터2) -> EL 수식
    • 변수에 함수를 할당할 수 있다.
<%@ page contentType="text/html; charset=utf-8" %>

<!DOCTYPE html>
<html>
<head>
    <title>asdf</title>
</head>
<body>
    <!--객체 이름 출력을 막기위해 세미콜론(;) 연산자 사용 후 빈 문자열 '' 출력-->
    ${greaterThan = (a,b) -> a > b ? "yes" : "no!"; ''}

    <p>${greaterThan(5,10)}</p>
    <p>${greaterThan(10,2)}</p>

</body>
</html>

 

2. 스트림 API


  • Java8의 스트림이 아닌 EL에 내장된 스트림 사용

  • 스트림 생성

${list.stream()}
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.Arrays" %>
<%@ page import="java.util.List" %>

<%
    List<Long> list = Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L);
    request.setAttribute("list", list);
%>

<!DOCTYPE html>
<html>
<head>
    <title>스트림</title>
</head>
<body>
    <p>${list.stream().toList()}</p>
</body>
</html>

출력결과

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

  • filter() 걸러내기
    • 람다식을 파라미터로 갖는다.
    • 스트림 각 원소에 대해 람다식을 실행한다.
    • 람다식의 결과가 true인 원소들로 새로운 스트림을 생성한다.
${list.stream().filter(x -> x%2 == 0).toList()}

출력결과

[2, 4, 6, 8, 10]

 

  • map() 변환
    • 람다식을 파라미터로 갖는다.
    • 스트림 각 원소에 대해 람다식을 실행한다.
    • 람다식의 결과들로 구성된 새로운 스트림을 생성한다.
${list.stream().map(x -> x*x).toList()}

출력결과

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

  • sorted() 정렬
    • 람다식을 파라미터로 갖는다.
    • Java에서 정렬을 위해서는 객체가 Comparable 인터페이스를 구현해야 한다.
    • EL에서는 Comparable을 대신할 람다식을 sorted()에 파라미터로 주어야한다.
    • 람다식은 두 개의 파라미터를 갖는다.
    • 두 파라미터 중 먼저 들어온 것이 앞에 오게하려면 -1, 뒤에 오게하려면 1을 리턴해준다.
    • 정렬된 새로운 스트림을 생성한다.
<%--default는 오름차순이다.--%>
${list.stream().sorted().toList()}

<%--내림차순 정렬 --%>
${list.stream().sorted((x1,x2) -> x1 > x2 ? -1 : 1).toList()}

<%--나이순 정렬. 상상해서 만든 객체이므로 출력결과는 보여주지 않는다.--%>
${membersList.stream().sorted((mem1, mem2) -> mem1.age > mem2.age ? -1 : 1).toList()}

출력결과

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

  • limit() 갯수제한
    • 앞의 n개만 선택해서 새로운 스트림을 생성한다.
${list.stream().limit(3).toList()}

출력결과

[1, 2, 3]

 

  • count() 갯수 세기
    • 스트림 원소의 수를 리턴한다.
    • Long 타입이다.
${list.stream().count()}

출력결과

10

 

  • 최종 집계 API

    • sum() 총합
    • max() 최대값
    • min() 최소값
    • average() 평균
  • sum()을 제외한 나머지 3개는 결과가 객체 형태이므로 출력을 하려면 .get()을 붙여야한다.

${list.stream().sum()} <%--합--%>
${list.stream().max().get()} <%--최대--%>
${list.stream().min().get()} <%--최소--%>
${list.stream().average().get()} <%--평균--%>

출력결과

55 
10 
1 
5.5 

 

  • get()은 스트림이 비어있거나 결과가 없을 경우 예외(exception)을 던진다.
    • 결과가 없을 경우 기본값을 지정하려면 orElse()를 사용한다.
${[].stream().max().orElse(10)} <%--최대값. 없으면 10--%>
${[].stream().min().orElse(0)} <%--최소값. 없으면 0--%>
${list.stream().max().orElse(100)} <%--최대값 있으므로 10 출력--%>

출력결과

10 
0 
10 

 

  • 값이 존재하는지 아닌지에 따라 true/false를 return하는 ifPresent()
${maxSquared = '-'; ''} <%--EL변수 선언 및 '-'로 초기화--%>
${list.stream().max().ifPresent(x -> (maxSquared = x*x))} <%--리스트 최대값 존재하면 제곱해서 maxSquared에 할당--%>
${maxSquared} <%--출력--%>

출력결과

100 

 

  • 존재 여부 확인 API
    • 람다식을 파라미터로 받는다.
    • 스트림 각 원소에 대해 람다식을 실행하고 그 결과에 따라 true/false 리턴
    • anyMatch() 하나라도 존재
    • allMatch() 모두 만족
    • noneMatch() 아무것도 만족하지 않음
${list.stream().anyMatch(x -> x > 3).get()}<%--3보다 큰 원소가 존재하면 true--%>
    ${list.stream().allMatch(x -> x > 5).get()}<%--모든 원소가 5보다 크면 true--%>
    ${list.stream().noneMatch(x -> x%2 == 0).get()}<%--짝수가 없으면 true--%>
true
false
false

' > JSP' 카테고리의 다른 글

15. EL(Expression Language) 메소드 호출  (0) 2020.07.21
14. EL(Expression Language) 연산자  (0) 2020.07.21
13. EL(Expression Language) 기본  (0) 2020.07.21
12. 세션(Session)  (0) 2020.07.19
11. 쿠키(Cookie)  (0) 2020.07.19

+ Recent posts