- [彿°å¼ç¼ç¨](#%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B)
- [Lambda 表达å¼](#lambda-%E8%A1%A8%E8%BE%BE%E5%BC%8F)
- [彿°å¼æ¥å£](#%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3)
- [å
ç½®ç彿°å¼æ¥å£](#%E5%86%85%E7%BD%AE%E7%9A%84%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3)
- [Predicate æè¨](#predicate-%E6%96%AD%E8%A8%80)
- [Comparator](#comparator)
- [Consumer](#consumer)
- [Stream](#stream)
- [Filter è¿æ»¤](#filter-%E8%BF%87%E6%BB%A4)
- [Sorted æåº](#sorted-%E6%8E%92%E5%BA%8F)
- [Map 转æ¢](#map-%E8%BD%AC%E6%8D%A2)
- [Match å¹é
](#match-%E5%8C%B9%E9%85%8D)
- [Count 计æ°](#count-%E8%AE%A1%E6%95%B0)
- [Reduce](#reduce)
- [flatMap](#flatmap)
- [Parallel-Streams](#parallel-streams)
- [Map éå](#map-%E9%9B%86%E5%90%88)
- [åèèµæ](#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99)
> æ¬æå·²ç»æ¶å½å°githubä»åºï¼æ¤ä»åºç¨äºå享Javaç¸å
³ç¥è¯æ»ç»ï¼å
æ¬Javaåºç¡ãMySQLãSpring BootãMyBatisãRedisãRabbitMQççï¼æ¬¢è¿å¤§å®¶æpråstarï¼
>
> githubå°åï¼https://github.com/Tyson0314/Java-learning
>
> 妿github访é®ä¸äºï¼å¯ä»¥è®¿é®giteeä»åºã
>
> giteeå°åï¼https://gitee.com/tysondai/Java-learning
## 彿°å¼ç¼ç¨
é¢å对象ç¼ç¨ï¼é¢å对象çè¯è¨ï¼ä¸åç对象ï¼å¦ææ³è¦è°ç¨ä¸ä¸ªå½æ°ï¼å½æ°å¿
é¡»å±äºä¸ä¸ªç±»æå¯¹è±¡ï¼ç¶åå¨ä½¿ç¨ç±»æå¯¹è±¡è¿è¡è°ç¨ãé¢å对象ç¼ç¨ä¼å¤åå¾å¤å¯è½æ¯éå¤ç代ç è¡ã
```java
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("do something...");
}
};
```
彿°å¼ç¼ç¨ï¼å¨æäºç¼ç¨è¯è¨ä¸ï¼å¦jsãc++ï¼æä»¬å¯ä»¥ç´æ¥åä¸ä¸ªå½æ°ï¼ç¶åå¨éè¦çæ¶åè¿è¡è°ç¨ï¼å³å½æ°å¼ç¼ç¨ã
## Lambda 表达å¼
å¨Java8以åï¼ä½¿ç¨`Collections`çsortæ¹æ³å¯¹å符串æåºçåæ³ï¼
```java
List names = Arrays.asList("dabin", "tyson", "sophia");
Collections.sort(names, new Comparator() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
```
Java8 æ¨è使ç¨lambda表达å¼ï¼ç®åè¿ç§åæ³ã
```java
List names = Arrays.asList("dabin", "tyson", "sophia");
Collections.sort(names, (String a, String b) -> b.compareTo(a)); //ç®ååæ³ä¸
names.sort((a, b) -> b.compareTo(a)); //ç®ååæ³äºï¼çç¥å
¥åç±»åï¼Java ç¼è¯å¨è½å¤æ ¹æ®ç±»åæ¨ææºå¶å¤æåºåæ°ç±»å
```
å¯ä»¥çå°ä½¿ç¨lambda表示å¼ä¹åï¼ä»£ç åå¾å¾ç®ç并䏿äºé
读ã
## 彿°å¼æ¥å£
Functional Interfaceï¼å½æ°å¼æ¥å£ï¼åªå
å«ä¸ä¸ªæ½è±¡æ¹æ³çæ¥å£ãåªæå½æ°å¼æ¥å£æè½ç¼©åæ Lambda 表达å¼ã@FunctionalInterface å®ä¹ç±»ä¸ºä¸ä¸ªå½æ°å¼æ¥å£ï¼å¦ææ·»å äºç¬¬äºä¸ªæ½è±¡æ¹æ³ï¼ç¼è¯å¨ä¼ç«å»æåºé误æç¤ºã
```java
@FunctionalInterface
interface Converter {
T convert(F from);
}
public class FunctionalInterfaceTest {
public static void main(String[] args) {
Converter converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("666");
System.out.println(converted);
}
/**
* output
* 666
*/
}
```
## å
ç½®ç彿°å¼æ¥å£
Comparator å Runnableï¼Java 8 为ä»ä»¬é½æ·»å äº @FunctionalInterface 注解ï¼ä»¥ç¨æ¥æ¯æ Lambda 表达å¼ã
### Predicate æè¨
æå®å
¥åç±»åï¼å¹¶è¿å boolean å¼ç彿°å¼æ¥å£ãç¨æ¥ç»åä¸ä¸ªå¤æçé»è¾å¤æã
```java
Predicate predicate = (s) -> s.length() > 0;
predicate.test("dabin"); // true
```
### Comparator
Java8 å° Comparator å级æå½æ°å¼æ¥å£ï¼å¯ä»¥ä½¿ç¨lambda表示å¼ç®å代ç ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-05 23:24
*/
public class ComparatorTest {
public static void main(String[] args) {
Comparator comparator = Comparator.comparing(p -> p.firstName);
Person p1 = new Person("dabin", "wang");
Person p2 = new Person("xiaobin", "wang");
// æå°-20
System.out.println(comparator.compare(p1, p2));
// æå°20
System.out.println(comparator.reversed().compare(p1, p2));
}
}
class Person {
public String firstName;
public String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
```
### Consumer
Consumer æ¥å£æ¥æ¶ä¸ä¸ªæ³ååæ°ï¼ç¶åè°ç¨ acceptï¼å¯¹è¿ä¸ªåæ°åä¸ç³»åæ¶è´¹æä½ã
Consumer æºç ï¼
```java
@FunctionalInterface
public interface Consumer {
void accept(T t);
default Consumer andThen(Consumer super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
```
示ä¾1ï¼
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-05 23:41
*/
public class ConsumerTest {
public static void main(String[] args) {
Consumer consumer = x -> {
int a = x + 6;
System.out.println(a);
System.out.println("大彬" + a);
};
consumer.accept(660);
}
/**
* output
* 666
* 大彬666
*/
}
```
示ä¾2ï¼å¨streaméï¼å¯¹å
¥ååä¸äºæä½ï¼ä¸»è¦æ¯ç¨äºforEachï¼å¯¹ä¼ å
¥çåæ°ï¼åä¸ç³»åçä¸å¡æä½ã
```java
// CopyOnWriteArrayList
public void forEach(Consumer super E> action) {
if (action == null) throw new NullPointerException();
Object[] elements = getArray();
int len = elements.length;
for (int i = 0; i < len; ++i) {
@SuppressWarnings("unchecked") E e = (E) elements[i];
action.accept(e);
}
}
CopyOnWriteArrayList list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
//forEachéè¦ä¼ å
¥Consumeråæ°
list
.stream()
.forEach(System.out::println);
list.forEach(System.out::println);
```
示ä¾3ï¼addThenæ¹æ³ä½¿ç¨ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-05 23:59
*/
public class ConsumersTest {
public static void main(String[] args) {
Consumer consumer1 = x -> System.out.println("first x : " + x);
Consumer consumer2 = x -> {
System.out.println("second x : " + x);
throw new NullPointerException("throw exception second");
};
Consumer consumer3 = x -> System.out.println("third x : " + x);
consumer1.andThen(consumer2).andThen(consumer3).accept(1);
}
/**
* output
* first x : 1
* second x : 1
* Exception in thread "main" java.lang.NullPointerException: throw exception second
* at com.dabin.java8.ConsumersTest.lambda$main$1(ConsumersTest.java:15)
* ...
*/
}
```
## Stream
ä½¿ç¨ `java.util.Stream` 对ä¸ä¸ªå
å«ä¸ä¸ªæå¤ä¸ªå
ç´ çéåååç§æä½ï¼åéåä¸åï¼è¿åæ°éåãåªè½å¯¹å®ç°äº `java.util.Collection` æ¥å£çç±»åæµçæä½ã`Map` 䏿¯æ `Stream` æµã`Stream` æµæ¯æåæ¥æ§è¡ï¼ä¹æ¯æå¹¶åæ§è¡ã
### Filter è¿æ»¤
Filter` çå
¥åæ¯ä¸ä¸ª `Predicateï¼ç¨äºçéåºæä»¬éè¦çéåå
ç´ ãåéåä¸åãfilter ä¼è¿æ»¤æä¸ç¬¦åç¹å®æ¡ä»¶çï¼ä¸é¢ç代ç ä¼è¿æ»¤æ`nameList`ä¸ä¸ä»¥å¤§å½¬å¼å¤´çå符串ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest {
public static void main(String[] args) {
List nameList = new ArrayList<>();
nameList.add("大彬1");
nameList.add("大彬2");
nameList.add("aaa");
nameList.add("bbb");
nameList
.stream()
.filter((s) -> s.startsWith("大彬"))
.forEach(System.out::println);
}
/**
* output
* 大彬1
* 大彬2
*/
}
```
### Sorted æåº
èªç¶æåºï¼ä¸æ¹ååéåï¼è¿åæåºåçéåã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest1 {
public static void main(String[] args) {
List nameList = new ArrayList<>();
nameList.add("大彬3");
nameList.add("大彬1");
nameList.add("大彬2");
nameList.add("aaa");
nameList.add("bbb");
nameList
.stream()
.filter((s) -> s.startsWith("大彬"))
.sorted()
.forEach(System.out::println);
}
/**
* output
* 大彬1
* 大彬2
* 大彬3
*/
}
```
éåºæåºï¼
```java
nameList
.stream()
.sorted(Comparator.reverseOrder());
```
对å
ç´ æä¸ªå段æåºï¼
```java
list.stream().sorted(Comparator.comparing(Student::getAge).reversed());
list.stream().sorted(Comparator.comparing(Student::getAge));
```
### Map 转æ¢
å°æ¯ä¸ªå符串转为大åã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest2 {
public static void main(String[] args) {
List nameList = new ArrayList<>();
nameList.add("aaa");
nameList.add("bbb");
nameList
.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
}
/**
* output
* AAA
* BBB
*/
}
```
### Match å¹é
éªè¯ nameList ä¸çå符串æ¯å¦æä»¥`大彬`å¼å¤´çã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest3 {
public static void main(String[] args) {
List nameList = new ArrayList<>();
nameList.add("大彬1");
nameList.add("大彬2");
boolean startWithDabin =
nameList
.stream()
.map(String::toUpperCase)
.anyMatch((s) -> s.startsWith("大彬"));
System.out.println(startWithDabin);
}
/**
* output
* true
*/
}
```
### Count 计æ°
ç»è®¡ `stream` æµä¸çå
ç´ æ»æ°ï¼è¿å弿¯ `long` ç±»åã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest4 {
public static void main(String[] args) {
List nameList = new ArrayList<>();
nameList.add("大彬1");
nameList.add("大彬2");
nameList.add("aaa");
long count =
nameList
.stream()
.map(String::toUpperCase)
.filter((s) -> s.startsWith("大彬"))
.count();
System.out.println(count);
}
/**
* output
* 2
*/
}
```
### Reduce
ç±»ä¼¼æ¼æ¥ãå¯ä»¥å®ç°å° `list` å½çº¦æä¸ä¸ªå¼ãå®çè¿åç±»åæ¯ `Optional` ç±»åã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:22
*/
public class StreamTest5 {
public static void main(String[] args) {
List nameList = new ArrayList<>();
nameList.add("大彬1");
nameList.add("大彬2");
Optional reduced =
nameList
.stream()
.sorted()
.reduce((s1, s2) -> s1 + "#" + s2);
reduced.ifPresent(System.out::println);
}
/**
* output
* 大彬1#大彬2
*/
}
```
### flatMap
flatMap ç¨äºå°å¤ä¸ªStreamè¿æ¥æä¸ä¸ªStreamã
ä¸é¢çä¾åï¼æå 个å°çlist转æ¢å°ä¸ä¸ªå¤§çlistã
```java
/**
* @description: æå 个å°çlist转æ¢å°ä¸ä¸ªå¤§çlistã
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:28
*/
public class StreamTest6 {
public static void main(String[] args) {
List team1 = Arrays.asList("大彬1", "大彬2", "大彬3");
List team2 = Arrays.asList("大彬4", "大彬5");
List> players = new ArrayList<>();
players.add(team1);
players.add(team2);
List flatMapList = players.stream()
.flatMap(pList -> pList.stream())
.collect(Collectors.toList());
System.out.println(flatMapList);
}
/**
* output
* [大彬1, 大彬2, 大彬3, 大彬4, 大彬5]
*/
}
```
ä¸é¢çä¾åä¸ï¼å°wordsæ°ç»ä¸çå
ç´ æç
§å符æåï¼ç¶å对å符å»éã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:35
*/
public class StreamTest7 {
public static void main(String[] args) {
List words = new ArrayList();
words.add("大彬æå¼º");
words.add("大彬666");
//å°wordsæ°ç»ä¸çå
ç´ æç
§å符æåï¼ç¶å对å符å»é
List stringList = words.stream()
.flatMap(word -> Arrays.stream(word.split("")))
.distinct()
.collect(Collectors.toList());
stringList.forEach(e -> System.out.print(e + ", "));
}
/**
* output
* 大, 彬, æ, 强, 6,
*/
}
```
## Parallel-Streams
å¹¶è¡æµã`stream` æµæ¯æ¯æ**顺åº**å**å¹¶è¡**çãé¡ºåºæµæä½æ¯åçº¿ç¨æä½ï¼ä¸²è¡åçæµæ æ³å¸¦æ¥æ§è½ä¸çæåï¼é常æä»¬ä¼ä½¿ç¨å¤çº¿ç¨æ¥å¹¶è¡æ§è¡ä»»å¡ï¼å¤çé度æ´å¿«ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest7 {
public static void main(String[] args) {
int max = 100;
List strs = new ArrayList<>(max);
for (int i = 0; i < max; i++) {
UUID uuid = UUID.randomUUID();
strs.add(uuid.toString());
}
List sortedStrs = strs.stream().sorted().collect(Collectors.toList());
System.out.println(sortedStrs);
}
/**
* output
* [029be6d0-e77e-4188-b511-f1571cdbf299, 02d97425-b696-483a-80c6-e2ef51c05d83, 0632f1e9-e749-4bce-8bac-1cf6c9e93afa, ...]
*/
}
```
## Map éå
Java8 é对 map æä½å¢å äºä¸äºæ¹æ³ï¼é常æ¹ä¾¿
1ãå é¤å
ç´ ä½¿ç¨`removeIf()`æ¹æ³ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-07 00:03
*/
public class MapTest {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put(1, "dabin1");
map.put(2, "dabin2");
//å é¤value没æå«æ1çé®å¼å¯¹
map.values().removeIf(value -> !value.contains("1"));
System.out.println(map);
}
/**
* output
* {1=dabin1}
*/
}
```
2ã`putIfAbsent(key, value) ` 妿æå®ç key ä¸åå¨ï¼å put è¿å»ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-07 00:08
*/
public class MapTest1 {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put(1, "大彬1");
for (int i = 0; i < 3; i++) {
map.putIfAbsent(i, "大彬" + i);
}
map.forEach((id, val) -> System.out.print(val + ", "));
}
/**
* output
* 大彬0, 大彬1, 大彬2
*/
}
```
3ãmap 转æ¢ã
```java
/**
* @author: ç¨åºå大彬
* @time: 2021-09-07 08:15
*/
public class MapTest2 {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);
Map newMap = map.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> "大彬" + String.valueOf(e.getValue())));
newMap.forEach((key, val) -> System.out.print(val + ", "));
}
/**
* output
* 大彬1, 大彬2,
*/
}
```
4ãmapéåã
```java
/**
* @author: ç¨åºå大彬
* @time: 2021-09-07 08:31
*/
public class MapTest3 {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put(1, "大彬1");
map.put(2, "大彬2");
//æ¹å¼1
map.keySet().forEach(k -> {
System.out.print(map.get(k) + ", ");
});
//æ¹å¼2
map.entrySet().iterator().forEachRemaining(e -> System.out.print(e.getValue() + ", "));
//æ¹å¼3
map.entrySet().forEach(entry -> {
System.out.print(entry.getValue() + ", ");
});
//æ¹å¼4
map.values().forEach(v -> {
System.out.print(v + ", ");
});
}
}
```
## åèèµæ
`https://juejin.im/post/5c3d7c8a51882525dd591ac7#heading-16`
æåç»å¤§å®¶å享ä¸ä¸ªgithubä»åºï¼ä¸é¢æ¾äº**200夿¬ç»å
¸çè®¡ç®æºä¹¦ç±**ï¼å
æ¬Cè¯è¨ãC++ãJavaãPythonãåç«¯ãæ°æ®åºãæä½ç³»ç»ãè®¡ç®æºç½ç»ãæ°æ®ç»æåç®æ³ãæºå¨å¦ä¹ ãç¼ç¨äººççï¼å¯ä»¥starä¸ä¸ï¼ä¸æ¬¡æ¾ä¹¦ç´æ¥å¨ä¸é¢æç´¢ï¼ä»åºæç»æ´æ°ä¸~
githubå°åï¼https://github.com/Tyson0314/java-books
妿github访é®ä¸äºï¼å¯ä»¥è®¿é®giteeä»åºã
giteeå°åï¼https://gitee.com/tysondai/java-books