Java – 流式API

这是我写的文章的前言。

這次開始不僅僅是純粹寫作,還會在文章中加入內心的聲音。由於正在努力學習Java Gold認證,如果能得到同樣在學的人的共鳴,我會感到很開心…※主人是常滑市出身

“StreamAPI?那是什么东西啊”

突然出现了 StreamAPI!作为只有黑书的人,感觉好突然啊!真是非常抱歉啊!听说在 Java Gold 中经常遇到这个问题…

「第一题 关于Optional类…(哎呀,不是StreamAPI吗!)」
我原本以为只需要记住StreamAPI的方法使用就好了,结果怎么又冒出Optional来了…
总之,暂时先查一下相关资料和黑皮书的内容吧。

## 可选的类 (optional class)

Java SE 8引入的java.util.Optional是一种用于处理方法返回结果的类,无论处理结果是正常还是异常,都可以以相同的类型进行处理。通过使用这个类,可以减少关于异常处理的代码,并提高代码的可读性。–引自黒本解説

「你说什么呢?这个东西已经很方便了,还说什么要用呢?乡下人真是跟不上时代啊!」

“暂时先看看样本代码吧…”

示例代码

※我在源代码中随意添加了一些注释。

public class OldTest {
	public void test() {
		try {
			///getFromArrayメソッドは配列からインデックス番号に一致する要素を戻す
			String result = getFromArray(new String[] { "A", "B", null }, 3);
			
			//resultがnullの時はemptyと出力
			if (result == null) {
				System.out.println("empty");
				return;
			}
			
			//resultがnullでなければresultを出力
			System.out.println(result);
		} catch (IllegalArgumentException e) {
			System.out.println("exception");
		}
	}

	private static <T> T getFromArray(T[] array, int index) {
		
		//arrayがnullの時は例外をthrow
		if (array == null) {
			throw new IllegalArgumentException();
		}
		
		//指定されたindex番号の要素を返す
		try {
			return array[index];
		} catch (ArrayIndexOutOfBoundsException e) {
			throw new IllegalArgumentException();
		}
	}
}

(解释) “使用getFromArray方法时需要注意以下4点:
1. 参数数组是引用类型……”

等一下!请不要用示例代码增加问题!

当我在调查不懂的事情时,会出现更不懂的事情。而当我调查那些事情时,又会出现更更不懂的事情…直到我去探索宇宙的起源为止…

以下是由恶魔的魔导书(黑本)引发的疑点。

私有的静态方法,从数组中取出指定索引的元素。

「虽然做了很多异常处理,但到底是什么异常呢?这个人真是忙啊,总是在做try-catch啊、throw啊之类的事情。」

非常幸运的是,在这次情况下,不需要调查宇宙的起源,只要问问ChatGPT老师就行了。”……你能不能帮我参加考试呀(´;ω;`)”

①”的真实身份

「T是什么意思?是指Twice吗?还是指TT兄弟?还是D的一族?还是在谈论《航海王》?」

根据ChatGpt先生的说法,先不要考虑无聊的冷笑话…

這是在談論Java的泛型(Generics)。泛型是為了提高代碼的重用性和類型安全性而引入的功能。
泛型被稱為類型參數(Type Parameter),用於表示任意類型。在這種情況下,它被用於使方法的返回類型和參數類型成為泛型類型。

总之,如果在方法前加上“对于”,那就是指以该类型接收参数并返回相同类型的意思。

常见的是在List类上指定类型的那一部分。

///入れられる型がString型に限定される
List<String> arr = new ArrayList<String>();

关于泛型类型就先说到这里吧…(深入调查开始会迷失在宇宙中…)
以这个例子来说,getFromArray方法可以接受任何类型的数组,并返回该数组指定索引号的元素。

2. 引出例外情况

暫時來說,這次出現的例外有以下三種情況。

例外throwの条件IllegalArgumentExceptionメソッドに渡された引数が無効または不正ArrayIndexOutOfBoudsException配列のインデックスが範囲外NullPointerException(←これは解説で出てきたので一応紹介)nullの参照を使用しようとする

由于↑是无检查异常(Unchecked Exception),所以在方法签名中不需要使用throws关键字进行声明(方法名及其参数的类型、数量和顺序等部分)。

顺便提一下,我在Java Silver考试中遇到了关于异常的问题。

异常检查在编译时进行,通过强制异常处理来捕捉错误并进行适当的恢复处理。与此相反,非检查异常表示意外错误或运行时错误,表明很难继续程序的正常执行。

谢谢,ChatGpt老师!因为编辑器总是自动帮我生成,所以我经常会忘记哦。

「嗯?记住在Silver里做过的事情吗?」

「…」

“嗯?发生了什么事?”

回到宇宙,然后进入正题。

我终于可以回到正题了… (Wǒ huí …)

据解释,根据样本代码,似乎存在以下四个问题。而且据说只要使用Optional类就可以解决这些问题。

    1. 由于参数数组是引用类型,所以有可能传递null值。

 

    1. 传递的参数索引可能超过数组的元素范围。

 

    1. 数组元素可能为空,如果接收返回值的一方不进行空值检查,可能会导致java.lang.NullPointerException异常。

 

    抛出的java.lang.IllegalArgumentException是非检查异常,可能会被忽略异常处理。

「真的吗?」

1. 由于参数数组是引用类型,可能会传入null。

2. 可能存在传递参数中的索引超过数组元素的情况。

String result = getFromArray(new String[] { "A", "B", null }, 3);

“确实,该引用了一个String类型的数组,并且指定了索引为3,超出了元素数量…”

“嗯,也许只是因为这是示例代码,所以没有使用方法参数,而是在方法内部使用了生成的数组,这应该很明显吧…总之,它的结构很奇怪,并不是关于可能性之类的问题…”

「小时候,我对于那些不在同一时间离家的兄弟和点P的运动毫不在意。但现在,感觉真是让人生气。」

3. 数组的元素可能为空,如果没有在接收返回值的一方进行空值检查,可能会引发java.lang.NullPointerException异常。

若在getFromArray方法中将索引数设为2,指定null元素,将会引发异常。

String result = getFromArray(new String[] { "A", "B", null }, 3);
//NUllPointerExceptionが発生
System.out.println(result.length();

这也不是因为处理结果变成了null,而是因为自己把它变成了null,感觉有点傻。

因为只需要一个选项,请原生地用中文换句话说:“这只是个样本,所以你是在为我扮演傻瓜吗!…呜呜(´;ω;`)谢谢!”

由于java.lang.IllegalArgumentException是一种未检查的异常,所以有可能会被忽略异常处理。

「没有例外被忽视!?这是什么意思??」
「ChatGpt老师!」

ChatGpt的答复:忽略异常的模式。

    如果没有catch块存在:即使发生了未检查异常,如果没有相应的catch块来捕获该异常,异常处理将被忽略。
public void someMethod() {
    throw new RuntimeException("An exception occurred");
}

public void anotherMethod() {
    someMethod(); // 例外がスローされるが、catchブロックが存在しないため無視される
}
    如果在catch块中没有再次抛出异常:即使捕获到非检查异常,也可以选择忽略它而不再次抛出。
public void someMethod() {
    try {
        // 何らかの処理
    } catch (RuntimeException e) {
        // 例外がキャッチされるが、再度スローされずに無視される
    }
}

「嗯,这个’无视’指的不是系统自动忽略,而是程序员选择忽略的意思啊」
「嗯,也不是完全没有…」

使用Optional类的解决方案。

“终于能回到Optional类的讨论了”
“哎呀,今天不是在学习streamAPI吗…?”

先看看我附上了许多评论的样本吧!

import java.util.Optional;

public class OldTest {
	public void test() {
		//おバカなので配列のindex数を超えた値を指定してしまってる!
		Optional<String> result = getFromArray(new String[] { "A", "B,", null }, 3);
		
		//getFromArrayメソッド側で例外が出るときは"empty"を返すようになっていて
		//try-catchをなくすことができたね!
		if (result.isEmpty()) {
			System.out.println("empty");
			return;
		}
		//例外がなければコンソールに出力
		System.out.println(result.get());
	}

	private static <T> Optional<T> getFromArray(T[] array, int index) {

		//NullPointerExceptionを回避しようとしている
		if (array == null) {
			return Optional.empty();
		}

		//指定されたindex番号の要素を返す
		try {
			return Optional.ofNullable(array[index]);
		} catch (ArrayIndexOutOfBoundsException e) {
			return Optional.empty();
		}
	}
}

「 可选的 从数组中获取….是什么意思」

「 还是绝对是TWICE嘛…」对于这个问题,我找不到令人满意的答案,所以一旦我理解了,我会加上说明。

這次就到這裡吧。結果我還是沒有掌握StreamAPI,只解了一個黑魔法書(黑本)的問題…

SE太难了
※下次也是可选的调查!

广告
将在 10 秒后关闭
bannerAds