[Java 8] 선택적 클래스 및 함수형 프로그래밍
옵셔널 클래스의 사용법
Java의 Optional 클래스는 빈 값이 있을 수 있는 상황을 처리하는 데 사용됩니다. 널 포인터 예외 발생을 줄이기 위해 Java 8에서 도입되었습니다.
일반적으로 if를 사용하여 개체가 null인지 판단한 다음 일부 처리를 수행하지만 이는 우아하지 않습니다. 다음과 같이:
List<String> list = new ArrayList<>();
// 常规方法
if(list != null){
List<String> new_list = new ArrayList<>();
for(String s : list){
if("".equals(s)) continue;
new_list.add(s);
}
return new_list;
}else{
return null
}
// 优雅写法 使用Optional + 函数式编程
return Optional.ofNullable(list)
.filter(s -> !"".equals(s))
.orElse(null);
Optional 클래스의 일반적인 메서드
선택적 개체를 만듭니다.
Optional<T> optionalValue = Optional.of(value); // 值不能为空
Optional<T> optionalNullableValue = Optional.ofNullable(nullableValue); // 值可以为空
Optional<T> optionalEmpty = Optional.empty(); // 创建一个空的 Optional 对象
선택적 개체에 값이 포함되어 있는지 확인합니다.
optionalValue.isPresent(); // 返回 true,如果值存在
선택적 개체에서 값을 가져옵니다.
T value = optionalValue.get(); // 若值存在,则获取该值,否则抛出 NoSuchElementException 异常
확인 및 조치:
optionalValue.ifPresent(val -> {
// 如果值存在,则执行操作
});
기본값 사용:
T value = optionalValue.orElse(defaultValue); // 如果值存在,则返回该值,否则返回默认值
T value = optionalValue.orElseGet(() -> {
// 如果值不存在,则执行自定义操作生成默认值
});
다른 방법:
optionalValue.map(val -> {
// 对值进行映射转换操作
});
optionalValue.filter(val -> {
// 过滤值的条件
});
optionalValue.flatMap(val -> {
// 针对嵌套 Optional 进行操作
});
Optional 클래스를 사용할 때 주로 함수형 프로그래밍 방법인 Consumer, Predicate, Function 클래스와 함께 사용합니다.
optional.ifPresent 및 소비자 클래스
Optional.ifPresent의 소스 코드를 관찰하십시오.
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
소비자는 하나의 입력 매개 변수를 사용하고 결과를 반환하지 않는 작업을 나타내는 기능 인터페이스입니다. 일반적으로 개체의 상태 수정, 정보 인쇄 등과 같이 주어진 매개 변수에 대해 일부 작업을 수행하는 데 사용됩니다.
소비자 인터페이스에는 T 형식의 매개 변수를 수락하고 이에 대해 작동하는 추상 메서드 void accept(T t)가 포함되어 있습니다.
선택적.ifPresent 샘플 코드:
자바
Optional.ofNullable(user).ifPresent(o -> {
// ifPresent确定是否有值 之后进行赋值或打印等无return操作
o.setName("...");
System.out.println(o);
}));
optional.filter 및 Predicate 클래스
Optional.filter의 소스 코드를 관찰하십시오.
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}
술어는 어설션(판단 조건)을 나타내고 입력 매개변수를 수락하고 부울 값을 반환하는 기능 인터페이스입니다. 일반적으로 컬렉션을 필터링하거나 입력 매개변수의 합법성을 확인하는 데 사용됩니다.
Predicate 인터페이스에는 T 유형의 매개변수를 받아들이고 판단 결과를 나타내는 Boolean 값을 반환하는 추상 메서드 boolean test(T t)가 포함되어 있습니다.
선택적 필터 샘플 코드:
자바
Optional.ofNullable(str).filter(o -> !"".equals(o) );
optional.map 및 함수 클래스
Optional.map의 소스 코드를 관찰하십시오.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
Function<T, R>은 하나의 입력 매개변수를 취하고 하나의 결과를 반환하는 작업을 나타내는 기능 인터페이스입니다. 일반적으로 하나의 값을 다른 값으로 변환하거나 복잡한 계산을 수행하는 데 사용됩니다.
Function 인터페이스에는 T 유형의 매개 변수를 수락하고 R 유형의 결과를 반환하는 추상 메서드 R apply(T t)가 포함되어 있습니다.
optional.map 샘플 코드:
자바
Optional.ofNullable(str).map(o -> {
// 进行一些操作 然后return数据
return str;
} );