我正在了解Streams API。
第一行的 2 发生了什么?它被视为什么数据类型?为什么不打印 true ?
System.out.println(Stream.of("hi", "there",2).anyMatch(i->i=="2"));
这个问题的第二部分是为什么下面的代码不能编译( 2不在引号中)?
System.out.println(Stream.of("hi", "there",2).anyMatch(i->i==2));
答案 0 :(得分:7)
在第一个代码段中,您正在创建Stream
Object
个。 2
元素是Integer
,因此将其与String
“2”进行比较会返回false。
在第二个代码段中,您无法将任意对象与int
2进行比较,因为无法从Object
转换为2
。
要使第一个片段返回true,您必须将流的最后一个元素更改为String
(并使用equals
而不是==
,以便不依赖String
池):
System.out.println(Stream.of("hi", "there", "2").anyMatch(i->i.equals("2")));
可以使用equals
代替==
修复第二个代码段,因为任何equals
都存在Object
:
System.out.println(Stream.of("hi", "there",2).anyMatch(i->i.equals(2)));
答案 1 :(得分:3)
您应该使用:
System.out.println(Stream.of("hi", "there",2).anyMatch(i->i.equals(2)));
原因是anyMatch
您所做的i
内的比较是Object
,int
(来自流)并且与{{"2"
不兼容1}}。
另外,请注意第一部分成功编译,因为您将整数(对象)与对象字符串--function A
BEGIN TRANSACTION
UPDATE TABLE tbl SET A = A, B = B WHERE ID = @id
--logic
SELECT @a = A FROM tbl WHERE WHERE ID = @id
IF @a = 'True' UPDATE tbl SET B = 'False' WHERE ID = @id
--logic end
COMMIT TRANSACTION
--function B
BEGIN TRANSACTION
UPDATE TABLE tbl SET A = A, B = B WHERE ID = @id
--logic
SELECT @b = B FROM tbl WHERE WHERE ID = @id
IF @B = 'True' UPDATE tbl SET A = 'False' WHERE ID = @id
--logic end
COMMIT TRANSACTION
进行比较,因此返回false。