diff --git a/src/main/java/nextstep/fp/Conditional.java b/src/main/java/nextstep/fp/Conditional.java new file mode 100644 index 00000000..0cd77cdf --- /dev/null +++ b/src/main/java/nextstep/fp/Conditional.java @@ -0,0 +1,6 @@ +package nextstep.fp; + +@FunctionalInterface +public interface Conditional { + abstract boolean test(Integer number); +} diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index bd68fe1c..99b996a5 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -1,8 +1,10 @@ package nextstep.fp; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public class Lambda { +public class Lambda implements Conditional{ public static void printAllOld(List numbers) { System.out.println("printAllOld"); @@ -18,23 +20,26 @@ public static void printAllLambda(List numbers) { } public static void runThread() { - new Thread(new Runnable() { - @Override - public void run() { - System.out.println("Hello from thread"); - } - }).start(); +// new Thread(new Runnable() { +// @Override +// public void run() { +// System.out.println("Hello from thread"); +// } +// }).start(); + // 추상메서드(abstract method) 가 한개인 Runnable 인터페이스를 파라미터로 받아 생성하는 Thread를 람다식으로 변경 + new Thread(() -> System.out.println("Hello from thread")); } - public static int sumAll(List numbers) { + public static int sumAll(List numbers,Conditional conditional) { int total = 0; for (int number : numbers) { total += number; } + return total; } - public static int sumAllEven(List numbers) { + public static int sumAllEven(List numbers,Conditional conditional) { int total = 0; for (int number : numbers) { if (number % 2 == 0) { @@ -44,13 +49,19 @@ public static int sumAllEven(List numbers) { return total; } - public static int sumAllOverThree(List numbers) { + public static int sumAllOverThree(List numbers, Conditional conditional) { int total = 0; for (int number : numbers) { if (number > 3) { total += number; } } + return total; } + + @Override + public boolean test(Integer number) { + return false; + } } diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index b446983a..211ffb16 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; @@ -16,18 +17,28 @@ public static long countWords() throws IOException { List words = Arrays.asList(contents.split("[\\P{L}]+")); long count = 0; - for (String w : words) { - if (w.length() > 12) count++; - } +// for (String w : words) { +// if (w.length() > 12) count++; +// } + count = words.stream().filter(word -> word.length() > 12 ).count(); return count; } - public static void printLongestWordTop100() throws IOException { + public static List printLongestWordTop100() throws IOException { String contents = new String(Files.readAllBytes(Paths .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); // TODO 이 부분에 구현한다. + List longestSortedWordsTop100 = words.stream() + .distinct() + .filter(word -> word.length() > 12) + .sorted((a,b) -> {return b.length() - a.length();}) + .limit(100) + .map(word -> word.toLowerCase()) + .collect(Collectors.toList()); + + return longestSortedWordsTop100; } public static List doubleNumbers(List numbers) { @@ -39,6 +50,11 @@ public static long sumAll(List numbers) { } public static long sumOverThreeAndDouble(List numbers) { - return 0; + long result = numbers.stream() + .filter(number -> number > 3) + .map(number -> number * 2) + .reduce(0, (x, y) -> x + y); + + return result; } } \ No newline at end of file diff --git a/src/test/java/nextstep/fp/CarTest.java b/src/test/java/nextstep/fp/CarTest.java index 1ab1106f..13f23a49 100644 --- a/src/test/java/nextstep/fp/CarTest.java +++ b/src/test/java/nextstep/fp/CarTest.java @@ -8,13 +8,18 @@ public class CarTest { @Test public void 이동() { Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return true; - } +// Car actual = car.move(new MoveStrategy() { +// @Override +// public boolean isMovable() { +// return true; +// } +// }); + + Car lambdaCar = car.move(() ->{ + return true; }); - assertThat(actual).isEqualTo(new Car("pobi", 1)); + + assertThat(lambdaCar).isEqualTo(new Car("pobi", 1)); } @Test @@ -26,6 +31,9 @@ public boolean isMovable() { return false; } }); - assertThat(actual).isEqualTo(new Car("pobi", 0)); + + Car lambdaCar = car.move(() -> {return false;}); + + assertThat(lambdaCar).isEqualTo(new Car("pobi", 0)); } } diff --git a/src/test/java/nextstep/fp/LambdaTest.java b/src/test/java/nextstep/fp/LambdaTest.java index f240ac65..d1e5bfe7 100644 --- a/src/test/java/nextstep/fp/LambdaTest.java +++ b/src/test/java/nextstep/fp/LambdaTest.java @@ -33,19 +33,19 @@ public void runThread() throws Exception { @Test public void sumAll() throws Exception { - int sum = Lambda.sumAll(numbers); + int sum = Lambda.sumAll(numbers,(number) -> true); assertThat(sum).isEqualTo(21); } @Test public void sumAllEven() throws Exception { - int sum = Lambda.sumAllEven(numbers); + int sum = Lambda.sumAllEven(numbers,(number -> number %2 ==0)); assertThat(sum).isEqualTo(12); } @Test public void sumAllOverThree() throws Exception { - int sum = Lambda.sumAllOverThree(numbers); + int sum = Lambda.sumAllOverThree(numbers, (number) -> number > 3); assertThat(sum).isEqualTo(15); } } diff --git a/src/test/java/nextstep/fp/StreamStudyTest.java b/src/test/java/nextstep/fp/StreamStudyTest.java index 2962521a..0ecb003a 100644 --- a/src/test/java/nextstep/fp/StreamStudyTest.java +++ b/src/test/java/nextstep/fp/StreamStudyTest.java @@ -24,7 +24,8 @@ public void countWords() throws Exception { @Test public void printLongestWordTop100() throws Exception { - StreamStudy.printLongestWordTop100(); + List top100Words = StreamStudy.printLongestWordTop100(); + top100Words.forEach(System.out::println); } @Test