Skip to content

Commit 89ad504

Browse files
committed
Add Stage 1 Lesson 4
1 parent 399a971 commit 89ad504

17 files changed

+385
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>stage-1</artifactId>
7+
<groupId>com.segmentfault</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>stage-1-lesson-4</artifactId>
13+
14+
15+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
public class ActionDemo {
4+
5+
public static void main(String[] args) {
6+
7+
// 匿名内置类
8+
Runnable runnable = new Runnable() {
9+
@Override
10+
public void run() {
11+
System.out.println("小马哥");
12+
}
13+
};
14+
15+
// invokedynamic 指令 @since JDK 1.7
16+
// 请记住 java.lang.invoke.MethodHandle
17+
// java.lang.invoke.InvokeDynamic
18+
Runnable runnable2 = () -> {
19+
20+
};
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
import java.util.function.Consumer;
4+
5+
public class ConsumerDemo {
6+
7+
public static void main(String[] args) {
8+
9+
Consumer consumer = System.out::println;
10+
11+
consumer.accept("Hello,World");
12+
13+
Consumer<String> consumer2 = ConsumerDemo::echo;
14+
15+
// Fluent API
16+
// consumer2 -> consumer -> consumer
17+
consumer2.andThen(consumer).andThen(consumer).accept("Hello,小马哥");
18+
19+
}
20+
21+
public static void print(Consumer<? super CharSequence> cs, String message ){
22+
cs.accept(message);
23+
}
24+
25+
26+
private static void echo(String message) {
27+
System.out.println("echo : " + message);
28+
}
29+
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
import java.lang.annotation.*;
4+
5+
@Documented
6+
@Retention(RetentionPolicy.RUNTIME)
7+
@Target(ElementType.TYPE)
8+
public @interface DemoAnnotation {
9+
10+
String value();
11+
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
@DemoAnnotation(value = "hello")
4+
public class DemoAnnotationDemo {
5+
6+
public static void main(String[] args) {
7+
DemoAnnotation demoAnnotation = DemoAnnotationDemo.class.getAnnotation(DemoAnnotation.class);
8+
System.out.println(demoAnnotation.value());
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
import java.util.function.Function;
4+
5+
public class FunctionDemo {
6+
7+
public static void main(String[] args) {
8+
9+
Function<String, Long> stringToLong = Long::valueOf;
10+
11+
System.out.println(stringToLong.apply("1"));
12+
13+
Function<Long, String> longToString = String::valueOf;
14+
15+
System.out.println(longToString.apply(1L));
16+
17+
// "1" -> 1L -> "1"
18+
Long value = stringToLong.compose(String::valueOf).apply(1L);
19+
20+
}
21+
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
import java.util.function.Function;
4+
5+
public class FunctionDesignDemo {
6+
7+
public static void main(String[] args) {
8+
9+
Function function = a -> a;
10+
11+
// Function 可以用于同类转换
12+
Function<Integer, Integer> divide2 = a -> a / 2;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
public class FunctionalInterfaceDemo {
4+
5+
public static void main(String[] arg) {
6+
7+
8+
Function1 function1 = () -> {
9+
10+
};
11+
12+
FunctionalInterfaceWithoutAnnotation f2 = () -> {
13+
14+
};
15+
16+
17+
}
18+
19+
@FunctionalInterface
20+
public interface Function1 {
21+
22+
public abstract void execute();
23+
24+
// 不能出现两次抽象方法定义
25+
// void execute2();
26+
27+
default String getDescription() {
28+
return String.valueOf(this);
29+
}
30+
}
31+
32+
// @FunctionalInterface // @FunctionalInterface 并非必选的
33+
public interface FunctionalInterfaceWithoutAnnotation {
34+
35+
void execute();
36+
}
37+
38+
// @FunctionalInterface // @FunctionalInterface 只能描述接口
39+
// public class FunctionClass {
40+
//
41+
// }
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
import java.io.File;
4+
import java.io.FileFilter;
5+
import java.util.function.Predicate;
6+
7+
public class PredicateDemo {
8+
9+
public static void main(String[] args) {
10+
11+
Predicate<File> predicate = file -> true;
12+
13+
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.segmentfault.deep.in.java.functional;
2+
3+
import java.util.*;
4+
import java.util.function.Predicate;
5+
import java.util.stream.Stream;
6+
7+
public class PredicateDesignDemo {
8+
9+
public static void main(String[] args) {
10+
11+
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
12+
13+
Collection<Integer> even = filter(numbers, num -> num % 2 == 0);
14+
15+
Collection<Integer> odd = filter(numbers, num -> num % 2 != 0);
16+
17+
System.out.println(odd);
18+
19+
System.out.println(even);
20+
21+
Stream.of(1, 2, 3, 4, 5).filter(num -> num % 2 == 0).forEachOrdered(System.out::println);
22+
}
23+
24+
private static <E> Collection<E> filter(Collection<E> source, Predicate<E> predicate) {
25+
// 集合类操作,请不要直接利用参数
26+
List<E> copy = new ArrayList<E>(source);
27+
Iterator<E> iterator = copy.iterator();
28+
while (iterator.hasNext()) {
29+
E element = iterator.next();
30+
if (!predicate.test(element)) {
31+
iterator.remove();
32+
}
33+
}
34+
return Collections.unmodifiableList(copy);
35+
}
36+
}

0 commit comments

Comments
 (0)