Java 8의 새로운 기능 사용
선택 수업
-
Optional 클래스는 null이 될 수있는 컨테이너 개체입니다. 값이있는 경우 isPresent () 메서드는 true를 반환하고 get () 메서드를 호출하면 객체가 반환됩니다.
-
선택 사항은 컨테이너입니다. T 유형의 값을 보유하거나 null 만 보유 할 수 있습니다. 선택 사항은 null 값을 명시 적으로 확인할 필요가 없도록 많은 유용한 메서드를 제공합니다.
-
Optional 클래스의 도입은 널 포인터 예외에 대한 좋은 솔루션입니다.
선택적 소스 코드
public final class Optional<T> {
// 这个是通用的代表NULL值的Optional实例
private static final Optional<?> EMPTY = new Optional<>();
// 泛型类型的对象实例
private final T value;
// 实例化Optional,注意是私有修饰符,value置为NULL
private Optional() {
this.value = null;
}
// 直接返回内部的EMPTY实例
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
// 通过value实例化Optional,如果value为NULL则抛出NPE
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
// 通过value实例化Optional,如果value为NULL则抛出NPE,实际上就是使用Optional(T value)
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
// 如果value为NULL则返回EMPTY实例,否则调用Optional#of(value)
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
}
빈 옵션 만들기
Optional<User> emptyOpt = Optional.empty();
emptyOpt.get();
가치있는 옵션 만들기
Optional<User> emptyOpt = Optional.of(user);
User user1 = emptyOpt.get();
logger.info(JSONObject.toJSONString(user1));
Null 값 판단
// name不为空 否则orelse
String testname = Optional.ofNullable(user.getName()).orElse("李四");
logger.info(testname);
orElseGet 할당 객체
User user1 = new User(1, "张三", "西安");
User user2 = new User(2, "李四", "新疆");
user1 = null;
User user = Optional.ofNullable(user1).orElseGet(() -> user2);
logger.info(user.toString());
orElseThrow는 널 포인터를 던집니다.
User user = new User(1, "张三", "西安");
user =null;
User result = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());
맵 체인 운영
User user = new User(1, "zhangSan_LISI", "西安");
String names = Optional.of(user)
.map(u -> u.getName())
.map(name -> name.toLowerCase())
.map(str -> str.replace("_", ""))
.orElseThrow(() -> new NullPointerException("空指针异常"));
logger.info(names);
흐름
Java 8에서 컬렉션 인터페이스에는 스트림을 생성하는 두 가지 방법이 있습니다.
- stream () -컬렉션에 대한 직렬 스트림을 만듭니다.
- parallelStream () -컬렉션에 대한 병렬 스트림을 만듭니다.
각각
List<String> list = Arrays.asList("zhangsan", "", "lisi");
list.stream().forEach(System.out::println);
매핑 및 필터 (매핑 및 필터링 작업)
List<String> collect = list.stream()
.filter(x -> "lisi".equals(x))
.map(x ->x.toUpperCase())
.collect(Collectors.toList());
collect.stream().forEach(System.out::println);
정렬 됨
Random random = new Random();
random.ints().limit(20).sorted().forEach(System.out::println);
parallelStream 병렬 스트림 작업
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
람다 식
- Lambada를 사용하면 함수를 메소드 매개 변수로 사용할 수 있으며 Lambada를 사용하면 코드를 간결하게 만들 수 있습니다.
목록 컬렉션 탐색
1. forEach와 유사한 Lambada 표현식 사용
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
//froEace循环
for (Integer ret : list) {
System.out.println(ret);
}
//使用Lambada表达式输出
list.stream().forEach(x -> System.out.println(x));
list.stream().filter(x -> x % 2 == 0).forEach(x -> System.out.println(x));
2. 운영 맵
@Test
public void test1() {
List<HashMap<String, String>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
HashMap<String, String> map = new HashMap<>();
map.put(String.valueOf("键" + i), String.valueOf(i));
list.add(map);
}
//遍历HashMap得到其中的键
list.stream().forEach(x -> {
for (String y : x.keySet()) {
System.out.println("输出的值为:" + y);
}
});
//遍历HashMap得到其中的值
list.stream().forEach(x -> {
for (Map.Entry y : x.entrySet()) {
System.out.println("map中的值为:" + y);
}
});
}
지도 횡단
map.forEach((k, v) -> {
System.out.println(k + "====" + v);
});
스레드 만들기
public static void main(String[] args) {
new Thread(() -> {
System.out.println("我是进程1");
}).start();
new Thread(() -> {
System.out.println("我是进程2");
}).start();
new Thread(() -> {
System.out.println("我是进程3");
}).start();
}
지도 목록
@Test
public void test3() {
List<Person> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Person person = new Person("Person" + i, String.valueOf(i));
list.add(person);
}
Map<String, String> collect = list.stream().collect(Collectors.toMap(Person::getKey, Person::getValue));
System.out.println(collect);
}
목록에 매핑
@Test
public void test2() {
HashMap<String, String> map = new HashMap<>();
for (int i = 0; i < 10; i++) {
map.put(String.valueOf("键" + i), String.valueOf(i));
}
System.out.println(map);
//Map转List
List<Person> collect = map.entrySet()
.stream()
.map(x -> new Person(x.getKey(), x.getValue()))
.collect(Collectors.toList());
for (Person x : collect) {
System.out.println(x.getKey() + "====" + x.getValue());
}
map.forEach((k, v) -> {
System.out.println(k + "====" + v);
});
}
지도 필터링
@Test
public void test6(){
Map<String,String> map=new HashMap();
map.put("1","3");
map.put("1","1");
map.put("3","4");
map.put("4","6");
Map<String, String> collect = map.entrySet().stream().filter(x -> String.valueOf(x.getKey()).equals("1")).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
System.out.println(collect);
}