[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;
} );

추천

출처blog.csdn.net/qq_43592352/article/details/131825810