Skip to content
5 changes: 5 additions & 0 deletions src/main/java/nextstep/fp/Conditional.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package nextstep.fp;

public interface Conditional {
boolean isMatchedWithCondition(Integer number);
}
26 changes: 10 additions & 16 deletions src/main/java/nextstep/fp/Lambda.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,28 +26,22 @@ public void run() {
}).start();
}

public static int sumAll(List<Integer> numbers) {
int total = 0;
for (int number : numbers) {
total += number;
}
return total;
public static int sumAll(List<Integer> numbers, Conditional c) {
return sum(numbers, c);
}

public static int sumAllEven(List<Integer> numbers) {
int total = 0;
for (int number : numbers) {
if (number % 2 == 0) {
total += number;
}
}
return total;
public static int sumAllEven(List<Integer> numbers, Conditional c) {
return sum(numbers, c);
}

public static int sumAllOverThree(List<Integer> numbers, Conditional c) {
return sum(numbers, c);
}

public static int sumAllOverThree(List<Integer> numbers) {
private static int sum(List<Integer> numbers, Conditional c) {
int total = 0;
for (int number : numbers) {
if (number > 3) {
if (c.isMatchedWithCondition(number)) {
total += number;
}
}
Expand Down
16 changes: 9 additions & 7 deletions src/main/java/nextstep/fp/StreamStudy.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,21 @@ public static long countWords() throws IOException {
.get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("[\\P{L}]+"));

long count = 0;
for (String w : words) {
if (w.length() > 12) count++;
}
return count;
return words.stream().filter(v -> v.length() > 12).count();
}

public static void printLongestWordTop100() throws IOException {
String contents = new String(Files.readAllBytes(Paths
.get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("[\\P{L}]+"));

// TODO 이 부분에 구현한다.
words.stream()
.filter(v -> v.length() > 12)
.sorted((a, b) -> b.length() - a.length())
.distinct()
.collect(Collectors.toList())
.subList(0, 100)
.forEach(v -> System.out.println(v.toLowerCase()));
}

public static List<Integer> doubleNumbers(List<Integer> numbers) {
Expand All @@ -39,6 +41,6 @@ public static long sumAll(List<Integer> numbers) {
}

public static long sumOverThreeAndDouble(List<Integer> numbers) {
return 0;
return numbers.stream().filter(v -> v > 3).map(v -> v * 2).reduce(Integer::sum).orElse(0);
}
}
13 changes: 6 additions & 7 deletions src/main/java/nextstep/optional/Expression.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package nextstep.optional;

import java.util.stream.Stream;

enum Expression {
PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/");

Expand All @@ -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 Stream.of(values())
.filter(v -> matchExpression(v, expression))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
7 changes: 6 additions & 1 deletion src/main/java/nextstep/optional/User.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package nextstep.optional;

import java.util.Optional;

public class User {
private String name;
private Integer age;
Expand Down Expand Up @@ -33,7 +35,10 @@ public static boolean ageIsInRange1(User user) {
}

public static boolean ageIsInRange2(User user) {
return false;
Optional<User> optUser = Optional.ofNullable(user);
Optional<Integer> optUserAge = optUser.map(User::getAge).filter(v -> v >= 30).filter(v -> v <= 45);

return optUserAge.isPresent();
}

@Override
Expand Down
7 changes: 1 addition & 6 deletions src/main/java/nextstep/optional/Users.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@ public class Users {
new User("honux", 45));

User getUser(String name) {
for (User user : users) {
if (user.matchName(name)) {
return user;
}
}
return DEFAULT_USER;
return users.stream().filter(v -> v.matchName(name)).findFirst().orElse(DEFAULT_USER);
}
}
14 changes: 2 additions & 12 deletions src/test/java/nextstep/fp/CarTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,14 @@ 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(() -> true);
assertThat(actual).isEqualTo(new Car("pobi", 1));
}

@Test
public void 정지() {
Car car = new Car("pobi", 0);
Car actual = car.move(new MoveStrategy() {
@Override
public boolean isMovable() {
return false;
}
});
Car actual = car.move(() -> false);
assertThat(actual).isEqualTo(new Car("pobi", 0));
}
}
6 changes: 3 additions & 3 deletions src/test/java/nextstep/fp/LambdaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}