彿°å¼ç¼ç¨
彿°å¼ç¼ç¨
é¢å对象ç¼ç¨ï¼é¢å对象çè¯è¨ï¼ä¸åç对象ï¼å¦ææ³è¦è°ç¨ä¸ä¸ªå½æ°ï¼å½æ°å¿ é¡»å±äºä¸ä¸ªç±»æå¯¹è±¡ï¼ç¶åå¨ä½¿ç¨ç±»æå¯¹è±¡è¿è¡è°ç¨ãé¢å对象ç¼ç¨å¯è½éè¦å¤åå¾å¤éå¤ç代ç è¡ã
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("do something...");
}
};
彿°å¼ç¼ç¨ï¼å¨æäºç¼ç¨è¯è¨ä¸ï¼å¦jsãc++ï¼æä»¬å¯ä»¥ç´æ¥åä¸ä¸ªå½æ°ï¼ç¶åå¨éè¦çæ¶åè¿è¡è°ç¨ï¼å³å½æ°å¼ç¼ç¨ã
Lambda 表达å¼
å¨Java8以åï¼ä½¿ç¨Collectionsçsortæ¹æ³å¯¹å符串æåºçåæ³ï¼
List<String> names = Arrays.asList("dabin", "tyson", "sophia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
Java8 æ¨è使ç¨lambda表达å¼ï¼ç®åè¿ç§åæ³ã
List<String> 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 å®ä¹ç±»ä¸ºä¸ä¸ªå½æ°å¼æ¥å£ï¼å¦ææ·»å äºç¬¬äºä¸ªæ½è±¡æ¹æ³ï¼ç¼è¯å¨ä¼ç«å»æåºé误æç¤ºã
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
public class FunctionalInterfaceTest {
public static void main(String[] args) {
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("666");
System.out.println(converted);
}
/**
* output
* 666
*/
}
å ç½®ç彿°å¼æ¥å£
Comparator å Runnableï¼Java 8 为ä»ä»¬é½æ·»å äº @FunctionalInterface 注解ï¼ä»¥ç¨æ¥æ¯æ Lambda 表达å¼ã
Predicate æè¨
æå®å ¥åç±»åï¼å¹¶è¿å boolean å¼ç彿°å¼æ¥å£ãç¨æ¥ç»åä¸ä¸ªå¤æçé»è¾å¤æã
Predicate<String> predicate = (s) -> s.length() > 0;
predicate.test("dabin"); // true
Comparator
Java8 å° Comparator å级æå½æ°å¼æ¥å£ï¼å¯ä»¥ä½¿ç¨lambda表示å¼ç®å代ç ã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-05 23:24
*/
public class ComparatorTest {
public static void main(String[] args) {
Comparator<Person> 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 æºç ï¼
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
示ä¾1ï¼
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-05 23:41
*/
public class ConsumerTest {
public static void main(String[] args) {
Consumer<Integer> consumer = x -> {
int a = x + 6;
System.out.println(a);
System.out.println("大彬" + a);
};
consumer.accept(660);
}
/**
* output
* 666
* 大彬666
*/
}
示ä¾2ï¼å¨streaméï¼å¯¹å ¥ååä¸äºæä½ï¼ä¸»è¦æ¯ç¨äºforEachï¼å¯¹ä¼ å ¥çåæ°ï¼åä¸ç³»åçä¸å¡æä½ã
// 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<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
//forEachéè¦ä¼ å
¥Consumeråæ°
list
.stream()
.forEach(System.out::println);
list.forEach(System.out::println);
示ä¾3ï¼addThenæ¹æ³ä½¿ç¨ã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-05 23:59
*/
public class ConsumersTest {
public static void main(String[] args) {
Consumer<Integer> consumer1 = x -> System.out.println("first x : " + x);
Consumer<Integer> consumer2 = x -> {
System.out.println("second x : " + x);
throw new NullPointerException("throw exception second");
};
Consumer<Integer> 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ä¸ä¸ä»¥å¤§å½¬å¼å¤´çå符串ã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest {
public static void main(String[] args) {
List<String> 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 æåº
èªç¶æåºï¼ä¸æ¹ååéåï¼è¿åæåºåçéåã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest1 {
public static void main(String[] args) {
List<String> 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
*/
}
éåºæåºï¼
nameList
.stream()
.sorted(Comparator.reverseOrder());
对å ç´ æä¸ªå段æåºï¼
list.stream().sorted(Comparator.comparing(Student::getAge).reversed());
list.stream().sorted(Comparator.comparing(Student::getAge));
Map 转æ¢
å°æ¯ä¸ªå符串转为大åã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest2 {
public static void main(String[] args) {
List<String> nameList = new ArrayList<>();
nameList.add("aaa");
nameList.add("bbb");
nameList
.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
}
/**
* output
* AAA
* BBB
*/
}
Match å¹é
éªè¯ nameList ä¸çå符串æ¯å¦æä»¥å¤§å½¬å¼å¤´çã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest3 {
public static void main(String[] args) {
List<String> 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 ç±»åã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest4 {
public static void main(String[] args) {
List<String> 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 ç±»åã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:22
*/
public class StreamTest5 {
public static void main(String[] args) {
List<String> nameList = new ArrayList<>();
nameList.add("大彬1");
nameList.add("大彬2");
Optional<String> reduced =
nameList
.stream()
.sorted()
.reduce((s1, s2) -> s1 + "#" + s2);
reduced.ifPresent(System.out::println);
}
/**
* output
* 大彬1#大彬2
*/
}
flatMap
flatMap ç¨äºå°å¤ä¸ªStreamè¿æ¥æä¸ä¸ªStreamã
ä¸é¢çä¾åï¼æå 个å°çlist转æ¢å°ä¸ä¸ªå¤§çlistã
/**
* @description: æå 个å°çlist转æ¢å°ä¸ä¸ªå¤§çlistã
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:28
*/
public class StreamTest6 {
public static void main(String[] args) {
List<String> team1 = Arrays.asList("大彬1", "大彬2", "大彬3");
List<String> team2 = Arrays.asList("大彬4", "大彬5");
List<List<String>> players = new ArrayList<>();
players.add(team1);
players.add(team2);
List<String> flatMapList = players.stream()
.flatMap(pList -> pList.stream())
.collect(Collectors.toList());
System.out.println(flatMapList);
}
/**
* output
* [大彬1, 大彬2, 大彬3, 大彬4, 大彬5]
*/
}
ä¸é¢çä¾åä¸ï¼å°wordsæ°ç»ä¸çå ç´ æç §å符æåï¼ç¶å对å符å»éã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:35
*/
public class StreamTest7 {
public static void main(String[] args) {
List<String> words = new ArrayList<String>();
words.add("大彬æå¼º");
words.add("大彬666");
//å°wordsæ°ç»ä¸çå
ç´ æç
§å符æåï¼ç¶å对å符å»é
List<String> 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 æµæ¯æ¯æé¡ºåºåå¹¶è¡çãé¡ºåºæµæä½æ¯åçº¿ç¨æä½ï¼ä¸²è¡åçæµæ æ³å¸¦æ¥æ§è½ä¸çæåï¼é常æä»¬ä¼ä½¿ç¨å¤çº¿ç¨æ¥å¹¶è¡æ§è¡ä»»å¡ï¼å¤çé度æ´å¿«ã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-06 00:05
*/
public class StreamTest7 {
public static void main(String[] args) {
int max = 100;
List<String> strs = new ArrayList<>(max);
for (int i = 0; i < max; i++) {
UUID uuid = UUID.randomUUID();
strs.add(uuid.toString());
}
List<String> 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()æ¹æ³ã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-07 00:03
*/
public class MapTest {
public static void main(String[] args) {
Map<Integer, String> 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 è¿å»ã
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-09-07 00:08
*/
public class MapTest1 {
public static void main(String[] args) {
Map<Integer, String> 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 转æ¢ã
/**
* @author: ç¨åºå大彬
* @time: 2021-09-07 08:15
*/
public class MapTest2 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);
Map<String, String> 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éåã
/**
* @author: ç¨åºå大彬
* @time: 2021-09-07 08:31
*/
public class MapTest3 {
public static void main(String[] args) {
Map<Integer, String> 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