From c1824f616826ddd0e04b56f9df134332d3d73d57 Mon Sep 17 00:00:00 2001 From: DK Date: Wed, 22 Nov 2023 16:09:22 +0900 Subject: [PATCH 1/2] feat : Lambda, Stream, Optional --- src/main/java/nextstep/fp/StreamStudy.java | 15 ++++++++++-- .../java/nextstep/optional/Expression.java | 13 +++++----- src/main/java/nextstep/optional/User.java | 24 ++++++++++++------- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index b446983a..64b8f71b 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -5,6 +5,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -27,7 +28,17 @@ public static void printLongestWordTop100() throws IOException { .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); - // TODO 이 부분에 구현한다. + //단어의 길이가 12자를 초과하는 단어를 추출한다. + //12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다. + //단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다. + //추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다. + + words.stream() + .filter(s -> s.length() > 12) + .sorted(Comparator.comparingInt(String::length).reversed()) + .distinct() + .map(String::toLowerCase) + .forEach(System.out::println); } public static List doubleNumbers(List numbers) { @@ -39,6 +50,6 @@ public static long sumAll(List numbers) { } public static long sumOverThreeAndDouble(List numbers) { - return 0; + return numbers.stream().filter(i -> i > 3).map(i -> i * 2).reduce(0, Integer::sum); } } \ No newline at end of file diff --git a/src/main/java/nextstep/optional/Expression.java b/src/main/java/nextstep/optional/Expression.java index 1c98cd6a..c710419c 100644 --- a/src/main/java/nextstep/optional/Expression.java +++ b/src/main/java/nextstep/optional/Expression.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Arrays; + enum Expression { PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/"); @@ -14,12 +16,9 @@ private static boolean matchExpression(Expression e, String expression) { } static Expression of(String expression) { - for (Expression v : values()) { - if (matchExpression(v, expression)) { - return v; - } - } - - throw new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)); + return Arrays.stream(values()) + .filter(v -> matchExpression(v, expression)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression))); } } diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index 9614c2f4..82818edf 100644 --- a/src/main/java/nextstep/optional/User.java +++ b/src/main/java/nextstep/optional/User.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Optional; + public class User { private String name; private Integer age; @@ -22,18 +24,24 @@ public boolean matchName(String name) { } public static boolean ageIsInRange1(User user) { - boolean isInRange = false; + Optional optionalUser = Optional.ofNullable(user); + return optionalUser + .filter(user1 -> user1.age != null) + .filter(User::isProperAge) + .isPresent(); + } - if (user != null && user.getAge() != null - && (user.getAge() >= 30 - && user.getAge() <= 45)) { - isInRange = true; - } - return isInRange; + private static boolean isProperAge(User user) { + return user.getAge() >= 30 + && user.getAge() <= 45; } public static boolean ageIsInRange2(User user) { - return false; + Optional optionalUser = Optional.ofNullable(user); + return optionalUser + .filter(user1 -> user1.age != null) + .filter(User::isProperAge) + .isPresent(); } @Override From b31a326db7371c7b68b4653deb6cbf0c044a32d1 Mon Sep 17 00:00:00 2001 From: DK Date: Wed, 22 Nov 2023 19:35:02 +0900 Subject: [PATCH 2/2] feat : Optional::ComputerStore --- src/main/java/nextstep/optional/ComputerStore.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java index 2695c967..4e0d2384 100644 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ b/src/main/java/nextstep/optional/ComputerStore.java @@ -3,6 +3,8 @@ import nextstep.optional.Computer.Soundcard; import nextstep.optional.Computer.USB; +import java.util.Optional; + public class ComputerStore { public static final String UNKNOWN_VERSION = "UNKNOWN"; @@ -21,6 +23,11 @@ public static String getVersion(Computer computer) { } public static String getVersionOptional(Computer computer) { - return null; + Optional optionalComputer = Optional.ofNullable(computer); + + return optionalComputer.map(Computer::getSoundcard) + .map(Soundcard::getUsb) + .map(USB::getVersion) + .orElse(UNKNOWN_VERSION); } }