# 背景

• forEach
• find
• filter
• map
• flatmap

• 用Java DIY 函数式方法—— forEach, find, filter
• 用Java DIY 函数式方法—— map
• 用Java DIY 函数式方法—— flatmap

# 注意

• 不适合对函数式一点基础都没有的读者
• DIY实现不是完美的，仅仅是用实例表达函数式方法的理解
• 这个系列文章不是分析java 8 stream中的方法源码，而是对java 8 stream特性，结合Kotlin， Rxjava之类的理解， 使用纯java的方式实现类似的函数式方法。
• 需要对java 中的泛型以及Collection有了解
• 会用到java 8 lambda表达式
• 要实际代码验证，需要 jdk 1.8

• 给出某个场景
• 使用 java 8
• 使用DIY 函数实现

# DIY 函数式方法

## forEach

``````        /** 需求：
* 给定一个String集合，然后遍历，打印出集合中每个元素
*/
``````

### 1. java 8 Iterable.forEach

java 8 在Iterable上添加了新方法 forEach， 同时也在Stream类中添加了forEach方法

``````List<String> list = Arrays.asList("Hello", "World!");
list.forEach(new Consumer<String>() {
@Override
public void accept(String item) {
out.println(item);
}
});
``````

``````list.forEach(item -> out.println(item));
``````

### 2. java 8 Stream.forEach

``````List<String> list = Arrays.asList("Hello", "World!");
list.stream().forEach(new Consumer<String>() {
@Override
public void accept(String item) {
out.print(item + " ");
}
});
``````

``````list.stream().forEach(item -> out.print(item + " "));
``````

### 3. DIY forEach

forEach原理： 遍历集合中的每一个元素，然后对其进行我们想要的操作

• 遍历
• 对每个item都有操作

``````    public static <T> void forEach(Collection<T> collection, Action<T> action){
for(T item: collection){
action.call(item);
}
}
public interface Action<T> {
void call(T item);
}
``````

forEach方法2个参数，第一个参数是需要处理的泛型集合， 第二个参数是操作处理。

``````List<String> list = Arrays.asList("Hello", "World!");
forEach(list, new Action<String>() {
@Override
public void call(String item) {
out.println(item);
}
});
``````

lambda简化

``````forEach(list, item -> out.println(item));
``````

## filter

``````         /** 需求：
*过滤出 [1, 2, ... 10]中是偶数的集合, 并打印出来！
*/
``````

### 1. java 8 stream

``````List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
integerList.stream()
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer % 2 == 0; //判断条件
}
})
.forEach(out::println);
``````

lambda简化版本

``````integerList.stream()
.filter(integer -> (integer % 2 == 0))
.forEach(out::println);
``````

### 2. DIY filter

• 遍历
• 有判断操作

``````    public static <T> Collection<T> filter(Collection<T> collection, Perdicate<T> perdicate ) {
Collection<T> result = new ArrayList<>();
for(T item : collection){
if(perdicate.call(item)) {
}
}
return result;
}

public interface Perdicate<T> {
boolean call(T item);  //判断方法
}
``````

``````filter(integerList, new Perdicate<Integer>() {
@Override
public boolean call(Integer item) {
return item % 2 == 0;
}
}).forEach(out::println);
``````

lambda简化：

``````filter(integerList, item -> item % 2 == 0).forEach(out::println);
``````

``````filter(Arrays.asList("a1", "ab1", "a1", "ab2", "ac"), item -> item.equals("a1")).forEach(out::println);
``````

## find

``````        /** 需求：
* [1, 2, ... 10]中的第一个元素
*/
``````

### 1. java 8 stream.findFirst

``````List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
out.println(integerList.stream().findFirst().get());
``````

### 2. DIY find

``````public static <T> T find(Collection<T> collection){
return collection.stream().findFirst().get();// 直接复用 stream 方法
}
``````
{"ft_lang_label":"__label__zh","ft_lang_prob":0.76279783,"math_prob":0.7658101,"size":4107,"snap":"2023-14-2023-23","text_gpt3_token_len":1996,"char_repetition_ratio":0.14306605,"word_repetition_ratio":0.07956989,"special_character_ratio":0.28341857,"punctuation_ratio":0.212828,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9613253,"pos_list":[0],"im_url_duplicate_count":[null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2023-06-03T00:59:20Z\",\"WARC-Record-ID\":\"<urn:uuid:4c42962e-7356-497e-9b79-ad0b70a914ad>\",\"Content-Length\":\"118865\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:0867d9dd-d184-424f-a0b1-300e78ae9e7b>\",\"WARC-Concurrent-To\":\"<urn:uuid:e7849883-f08b-4287-bc78-2204d5c73a09>\",\"WARC-IP-Address\":\"47.246.23.81\",\"WARC-Target-URI\":\"https://www.jianshu.com/p/f309d3aec0d3\",\"WARC-Payload-Digest\":\"sha1:7B7LO4DFX5CTPIVACGOWNQRTHHP24YY4\",\"WARC-Block-Digest\":\"sha1:4LEVGFEWITPFFW43Q6WXOJ3J4Z4DX3EP\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2023/CC-MAIN-2023-23/CC-MAIN-2023-23_segments_1685224648911.0_warc_CC-MAIN-20230603000901-20230603030901-00787.warc.gz\"}"}