我想知道哪个元素在谓词中失败了allmatch
.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean isEven = numbers.stream().allMatch(n-> n % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
这isEven
是false
因为元素1
未通过谓词.
我可以使用forEach
流来查找哪个元素失败:
numbers.stream().forEach(n -> {
if (n % 2 != 0)
System.out.println(n + "is Odd");
});
Run Code Online (Sandbox Code Playgroud)
有没有办法找出哪些元素在allmatch
返回时失败了谓词false
?
我在以下方法中T
使用了以下方法Func
:
public void DoSomething<T>(string someString, Func<T, bool> someMethod)
{
if(someCondition)
{
string A;
bool resultA = someMethod(A);
}
else
{
string[] B;
bool resultB = someMethod(B);
}
// Some other stuff here ...
}
Run Code Online (Sandbox Code Playgroud)
我DoSomething
按以下方式调用该方法:
DoSomething<string>("abc", someMethod);
DoSomething<string[]>("abc", someMethod);
Run Code Online (Sandbox Code Playgroud)
someMethod存在以下定义:
bool someMethod(string simpleString);
bool someMethod(string[] stringArray);
Run Code Online (Sandbox Code Playgroud)
现在编译失败,方法中出现以下错误DoSomething
:
cannot convert from 'string' to 'T'
cannot convert from 'string[]' to 'T'
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚是否有问题的解决方案,或者我正在尝试的是不可行的.它看起来类似于问题如何使用泛型类型参数传入func?虽然它对我的场景没有帮助.
装箱和拆箱仅为值类型定义。来源:
装箱是将值类型转换为类型对象或由该值类型实现的任何接口类型的过程。当 CLR 装箱值类型时,它会将值包装在 System.Object 内并将其存储在托管堆上。拆箱从对象中提取值类型。拳击是含蓄的;拆箱是明确的。装箱和拆箱的概念是 C# 类型系统统一视图的基础,其中任何类型的值都可以被视为对象。
装箱和拆箱的性能是一个昂贵的过程,来源:
装箱和拆箱是计算成本较高的过程。当一个值类型被装箱时,必须创建一个全新的对象。这可能比简单的参考分配花费最多 20 倍的时间。拆箱时,铸造过程可能需要四倍于作业的时间。
现在,如果我使用string
and string[]
,它们是引用类型,我会执行以下操作:
string A;
return (string)(object)A;
// IMP: Here first casting is similar to boxing (though for a reference type), and second casting is similar to unboxing.
Run Code Online (Sandbox Code Playgroud)
相似地,
string[] A;
return (string[])(object)A;
// IMP: Here first casting is similar to boxing (though for a reference type), and second casting is similar to unboxing.
Run Code Online (Sandbox Code Playgroud)
与计算成本较高的值类型不同,我们使用引用类型。对引用类型使用装箱/拆箱之类的技术是否会产生类似的性能影响?
它看起来类似于以下内容,但没有讨论性能影响(如果有):