2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Optional इति java8 इत्यस्मिन् प्रवर्तमानः नूतनः वर्गः अस्ति यस्याः समाधानं मुख्यसमस्या NullPointerException अस्ति ।
मूलपाठस्य अनुवादः (Baidu translation, my shortcomings in English): एकः पात्रवस्तु, यस्मिन् अशून्यमूल्यानि सन्ति वा न वा। यदि मूल्यं वर्तते तर्हि isPresent() सत्यं प्रत्यागमिष्यति । यदि मूल्यं नास्ति तर्हि वस्तु रिक्तं मन्यते तथा च isPresent() false प्रेषयति ।
अतिरिक्तविधयः प्रदत्ताः सन्ति ये समाविष्टस्य मूल्यस्य उपस्थितेः आधारेण भवन्ति, यथा orElse() (यदि मूल्यं नास्ति तर्हि पूर्वनिर्धारितं मूल्यं प्रत्यागच्छति) तथा ifPresent() (मूल्यं उपस्थिते सति क्रियां करोति)
एषः मूल्याधारितः वर्गः अस्ति; यथा, भविष्ये विमोचनं समन्वयनं विफलं भवितुम् अर्हति ।
अत्र अहं यत् मूलकार्यं अवगच्छामि तत् अस्ति यत् भवान् उत्तीर्णं कर्तुं शक्नोति isPresent()
विधिः वस्तुनः शून्यतायाः न्याये सहायकः भवति, ततः उत्तीर्णः भवतिmap()
, orElse()
,ifPresent()
अन्येषां पद्धतीनां संयोजनेन संहितायां दीर्घं यदि न्यायं बहु न्यूनीकर्तुं शक्यते।
先介绍一下常用所有的接口;
注意:
1. 此列表是列出了本人觉得有意义的接口不是全部。
2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
अन्तरफलकस्य नाम | कार्यस्य संक्षिप्तं वर्णनम् |
---|---|
Optional<T> empty() | एकं रिक्तं निर्मायताम्Optional वस्तु |
Optional<T> of(T value) | अशून्यस्य निर्माणं कुरुतOptional वस्तु यदि为空则报错 ! |
Optional<T> ofNullable(T value) | build aOptional वस्तु, रिक्तं भवितुं अनुमतिः अस्ति! |
T get() | सामान्यवस्तुमूल्यं प्राप्नुवन्तु, यदि मूल्यम्为空,则报错 |
boolean isPresent() | रिक्तं यदि नnull अथ इतिtrue |
boolean isEmpty() | रिक्तं यदिnull अथ इतिtrue |
ifPresent(Consumer) | एकं अन्तरफलकं कार्ययुगलं पारयन्तु, यदा दत्तांशः不为空 एतत् कार्यं यदा निष्पादितं भवति |
ifPresentOrElse(Consumer, Runnable) | द्वौ पैरामीटर्, प्रथमं रिक्तं न भवति चेत् निष्पादितं भवति, द्वितीयं रिक्तं भवति चेत् निष्पादितं भवति । ते सर्वे अन्तरफलककार्याणि सन्ति । |
Optional<T> filter | वस्तुनां कृते एकं छानकं |
Optional<U> map(Function) | परिवर्तनविधिः |
Optional<U> flatMap(Function) | परिवर्तनविधिः, सामान्यतया बहुस्तरीयरूपान्तरणेन सह एकस्मिन् स्तरे प्रयुक्ता |
Optional<T> or(Supplier) | वस्तु प्राप्ते सति为空 अन्तरफलककार्यस्य आधारेण नूतनं निर्मायन्ते सतिOptional वस्तु |
T orElse(T) | वस्तु प्राप्ते सति为空 निर्दिष्टं सामान्यवस्तुं प्राप्नुत यदा |
T orElseThrow() | 不为空 वस्तु प्रत्यागच्छतु, .为空 किन्तुNoSuchElementException |
T orElseThrow(Supplier) | 不为空 वस्तु प्रत्यागच्छतु, .为空 किन्तु指定异常 |
下面是常用接口的一些简单的演示
// 1. 构建一个空的 Optional 对象没有任何问题
Optional<Object> empty = Optional.empty();
// 2. 构建一个非空的 Optional 对象没有任何问题
Optional<Object> aa = Optional.of("123");
// 3. 构建一个空的 Optional 对象直接报错 ================ 会报错 of不允许为空
Optional<Object> bb = Optional.of(null);
// 4. 构建一个空的 Optional 对象没有任何问题
Optional<Object> cc = Optional.ofNullable(null);
// 5. 构建一个非空的 Optional 对象没有任何问题
Optional<Object> dd = Optional.ofNullable("123");
Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果为空的时候获取值就会直接报错
Object o = cc.get();
// 2. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o1 = cc.or(() -> Optional.ofNullable("123")).get();
// 3. 如果对象为空,则直接获取的是 123, orElse()中的参数是非空的。 如果对象不为空则直接获取到对象的值
Object o2 = cc.orElse("123");
// 4. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o3 = cc.orElseGet(() -> Optional.ofNullable("123"));
Optional<Object> cc = Optional.ofNullable(null);
// 1. 存在则返回true
boolean present = cc.isPresent();
// 2. 为null返回true
boolean empty = cc.isEmpty();
Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresent(item->{
System.out.println("不为空则执行我"+item);
});
// 2. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresentOrElse(item->{
System.out.println("不为空则执行我"+item);
},()->{
System.out.println("为空则执行我");
});
map 方法的使用跟 Stream 中的map方法一样,我的理解这里面的所有的接口方法与 Stream 中重名的用法都是一样的
@Data
public static class User{
private String name;
private Integer age;
}
@Test
void getMapTest(){
User user = new User();
user.setName("123");
Optional<User> optionalUser = Optional.of(user);
// 1. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
Optional<String> name = optionalUser.map(User::getName);
System.out.println(name.isEmpty()); // 输出 false
Optional<User> optionalUser2 = Optional.ofNullable(null);
// 2. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
Optional<String> name2 = optionalUser2.map(User::getName);
System.out.println(name2.isEmpty()); // 输出 true
}
अन्ये विधयः : १.
filter
: एषा पद्धतिः छाननाय अस्ति,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get);
मया मूलतः अत्र कदापि तस्य उपयोगः न कृतः, उपयोगस्य परिदृश्यं नास्ति इति अहं अनुभवामि ।
flatMap
: अहम् एतत् पद्धतिं अनबॉक्सिंग् रूपान्तरणं इति अवगच्छामि: यथा, स्थापयतु Stream<Optional<T>>
परिवर्तयतुOptional<T>
Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
TODO 这里后面再不吧,暂时也没有太合适的例子
Optional
जावा 8 इत्यस्मिन् प्रवर्तितं, सम्भाव्यशून्यमूल्यानां निबन्धनस्य अधिकं सुरुचिपूर्णं सुरक्षितं च मार्गं प्रदाति ।मुख्यतः माध्यमेनor
,orElse
, ifPresent
रिक्तस्थानं सुरुचिपूर्णतया निर्धारयितुं अरिक्तक्रियाः कर्तुं च कार्यात्मकविधयः उपयोक्तुं शक्यन्ते एतेन अनेकस्तराः न्यूनीकर्तुं शक्यन्तेif
न्यायः संहिताम् सुरुचिपूर्णं करोति, परन्तु दोषाः सन्ति函数式
विधिः कोडस्य पठनीयतां न्यूनीकरिष्यति ।तथा आवश्यकता अपिLambda
किञ्चित् अवगमनं आवश्यकं भवति ।