Skip to content
This repository was archived by the owner on Feb 10, 2021. It is now read-only.

Commit bbf93da

Browse files
author
Taras
committed
Lambda tutorial
- implemented MethodReference.java, MethodReferenceExamples.java - refactored lambda examples - removed FunctionFactoryTask.java
1 parent b533265 commit bbf93da

13 files changed

+168
-149
lines changed

function-factory-task/pom.xml

-16
This file was deleted.

function-factory-task/src/main/java/com/bobocode/FunctionFactoryTask.java

-67
This file was deleted.

lambdas/src/main/java/com/bobocode/BehaviorParameterizationWithAnonymousClasses.java

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.bobocode.functions.Condition;
55
import com.bobocode.functions.Operation;
66
import com.bobocode.model.Account;
7-
import com.bobocode.util.TestDataProvider;
87

98
import java.math.BigDecimal;
109
import java.time.LocalDate;

lambdas/src/main/java/com/bobocode/BehaviorParameterizationWithLambda.java

-3
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44
import com.bobocode.functions.Condition;
55
import com.bobocode.functions.Operation;
66
import com.bobocode.model.Account;
7-
import com.bobocode.util.TestDataProvider;
87

98
import java.math.BigDecimal;
109
import java.time.LocalDate;
1110
import java.time.Period;
1211
import java.util.List;
1312

14-
import static java.time.Period.between;
15-
1613
/**
1714
* Behavior parameterization with Lambdas.
1815
*

lambdas/src/main/java/com/bobocode/HardcodedBehavior.java

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.bobocode.data.Accounts;
44
import com.bobocode.model.Account;
5-
import com.bobocode.util.TestDataProvider;
65

76
import java.math.BigDecimal;
87
import java.time.LocalDate;
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
11
package com.bobocode;
22

3+
import com.bobocode.data.Accounts;
4+
import com.bobocode.model.Account;
5+
6+
import java.util.List;
7+
import java.util.function.Consumer;
38
import java.util.function.Function;
49
import java.util.function.Supplier;
510

611
/**
7-
* Created by taras on 8/11/17.
12+
* Method reference is a shorthand for lambda expression that could be use in some cases for better readability.
813
*/
914
public class MethodReference {
1015
public static void main(String[] args) {
11-
// 1 - method reference to static method
12-
Function<Integer, Integer> absFunction = Math::abs;
13-
14-
int a = 5;
15-
16-
Function<Integer, Integer> f;
17-
18-
// 2 - methods reference to instance method
19-
String hello = "Hello";
20-
Supplier<String> helloUppercaseSupplier = hello::toUpperCase;
21-
doSomethingWithStringSupplier(helloUppercaseSupplier);
16+
List<Account> accounts = Accounts.getAccountList(10);
2217

23-
// 3 - special case (ClassName::objMethodName)
24-
Function<String, String> toUpperCase = String::toUpperCase;
25-
toUpperCase.apply("hello");
18+
printAccountsWithLambda(accounts);
19+
printAccountsWithMethodReference(accounts);
2620
}
2721

28-
static void doSomethingWithStringSupplier(Supplier<String> stringSupplier) {
29-
22+
private static void printAccountsWithLambda(List<Account> accounts) {
23+
consumeAccounts(accounts, a -> System.out.println(a));
3024
}
3125

32-
static String computeSomething() {
33-
// some operation
34-
return "hello";
26+
private static void printAccountsWithMethodReference(List<Account> accounts) {
27+
consumeAccounts(accounts, System.out::println); //todo: think what if you want to print only emails
3528
}
3629

37-
static void processSomething(String s) {
38-
30+
private static void consumeAccounts(List<Account> accounts, Consumer<Account> consumer) {
31+
for (Account account : accounts){
32+
consumer.accept(account);
33+
}
3934
}
35+
4036
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.bobocode;
2+
3+
import java.util.function.BiFunction;
4+
import java.util.function.Function;
5+
6+
/**
7+
* A list of method reference examples.
8+
*/
9+
public class MethodReferenceExamples {
10+
public static void main(String[] args) {
11+
printAbsUsingMethodReference(-23);
12+
printSumUsingMethodReference(25, 50);
13+
}
14+
15+
private static void printAbsUsingMethodReference(int a) {
16+
Function<Integer, Integer> absFunction = Math::abs;
17+
int result = absFunction.apply(a);
18+
19+
System.out.println("abd(" + a + ") = " + result);
20+
}
21+
22+
private static void printSumUsingMethodReference(int a, int b) {
23+
BiFunction<Integer, Integer, Integer> sumFunction = Math::addExact;
24+
int result = sumFunction.apply(a, b);
25+
26+
System.out.println(a +" + "+ b + " = " + result);
27+
}
28+
29+
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.bobocode;
2+
3+
import com.bobocode.data.Accounts;
4+
import com.bobocode.model.Account;
5+
6+
import java.math.BigDecimal;
7+
import java.time.LocalDate;
8+
import java.time.Period;
9+
import java.util.List;
10+
import java.util.function.Consumer;
11+
import java.util.function.Predicate;
12+
13+
/**
14+
* Predefined interface is a standard @{@link FunctionalInterface} that represent some well-known function type.
15+
* E.g. @{@link java.util.function.Predicate}, @{@link java.util.function.Function}, @{@link java.util.function.Consumer}
16+
*
17+
* The same example with custom functional interfaces was shown in {@link BehaviorParameterizationWithLambda}
18+
*/
19+
public class PredefinedInterface {
20+
public static void main(String[] args) {
21+
List<Account> accounts = Accounts.getAccountList(10);
22+
23+
processAccounts(accounts,
24+
a -> Period.between(a.getCreationDate().toLocalDate(), LocalDate.now()).getYears() > 4,
25+
a -> a.setBalance(a.getBalance().add(BigDecimal.valueOf(50))));
26+
}
27+
28+
/**
29+
* Customer functional interfaces @{@link com.bobocode.functions.Operation}, and @{@link com.bobocode.functions.Condition}
30+
* were removed in favor of standard ones @{@link Consumer}, and @{@link Predicate} accordingly
31+
*/
32+
private static void processAccounts(List<Account> accounts, Predicate<Account> accountPredicate,
33+
Consumer<Account> accountConsumer) {
34+
for (Account account : accounts) {
35+
if (accountPredicate.test(account)) {
36+
accountConsumer.accept(account);
37+
}
38+
}
39+
}
40+
41+
}

lambdas/src/main/java/com/bobocode/PredefinedInterfaces.java

-32
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.bobocode;
2+
3+
import com.bobocode.data.Accounts;
4+
import com.bobocode.model.Account;
5+
6+
import java.util.Random;
7+
import java.util.function.Consumer;
8+
import java.util.function.Function;
9+
import java.util.function.Predicate;
10+
import java.util.function.Supplier;
11+
import java.util.stream.IntStream;
12+
13+
/**
14+
* A list of predefined interfaces examples.
15+
*/
16+
public class PredefinedInterfacesExamples {
17+
public static void main(String[] args) {
18+
19+
printEmailUsingAccountConsumer();
20+
21+
printARandomNumberUsingIntegerSupplier();
22+
23+
calculate3xValueUsingIntegerFunction();
24+
25+
checkIfNumberIsPositiveUsingIntegerPredicate();
26+
27+
verifyGoogleEmailUsingAccountPredicate();
28+
29+
printPrimeNumbersUsingIntegerPredicate();
30+
31+
}
32+
33+
private static void printARandomNumberUsingIntegerSupplier() {
34+
Supplier<Integer> integerSupplier = () -> new Random().nextInt(1000);
35+
36+
System.out.println("Next value: " + integerSupplier.get());
37+
}
38+
39+
private static void printEmailUsingAccountConsumer() {
40+
Consumer<Account> accountConsumer = acc -> System.out.println(acc.getEmail());
41+
Account account = Accounts.getAccount();
42+
43+
accountConsumer.accept(account);
44+
}
45+
46+
private static void calculate3xValueUsingIntegerFunction() {
47+
Function<Integer, Integer> tripleFunction = n -> 3 * n;
48+
int a = 12;
49+
50+
System.out.println("3 * " + a + tripleFunction.apply(a));
51+
}
52+
53+
private static void checkIfNumberIsPositiveUsingIntegerPredicate() {
54+
Predicate<Integer> isPositive = n -> n > 0;
55+
int b = 23;
56+
57+
System.out.println(b + " is " + (isPositive.test(b) ? "positive" : "negative"));
58+
}
59+
60+
private static void verifyGoogleEmailUsingAccountPredicate() {
61+
Account account = Accounts.getAccount();
62+
Predicate<Account> isGmailUser = a -> a.getEmail().endsWith("@gmail.com");
63+
64+
System.out.println("\"" + account.getEmail() + "\"" + " is "
65+
+ (isGmailUser.test(account) ? "" : "not") + " a Google mail.");
66+
}
67+
68+
private static void printPrimeNumbersUsingIntegerPredicate() {
69+
Predicate<Integer> isPrime = n -> IntStream.range(2, n).noneMatch(i -> n % i == 0);
70+
71+
IntStream.range(1, 10)
72+
.forEach(i -> System.out.printf("%3d %10s\n", i, (isPrime.test(i) ? " is prime" : "")));
73+
}
74+
}

optional/src/main/java/com/bobocode/OptionalExample_Basics.java

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import com.bobocode.data.Accounts;
55
import com.bobocode.model.Account;
6-
import com.bobocode.util.TestDataProvider;
76

87
import java.util.List;
98
import java.util.Optional;

optional/src/main/java/com/bobocode/OptionalExample_Mapping.java

-5
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,11 @@
44
import com.bobocode.data.Accounts;
55
import com.bobocode.model.Account;
66
import com.bobocode.model.CreditAccount;
7-
import com.bobocode.util.TestDataProvider;
87

98
import java.math.BigDecimal;
109
import java.util.Collections;
1110
import java.util.List;
1211
import java.util.Optional;
13-
import java.util.OptionalDouble;
14-
15-
import static java.util.Comparator.comparing;
16-
import static java.util.stream.Collectors.maxBy;
1712

1813
/**
1914
*

0 commit comments

Comments
 (0)