Expression.OrElse和Expression.OrAssign的区别
时间: 2024-11-12 12:42:02 浏览: 21
`Expression.OrElse` 和 `Expression.OrAssign` 都是在 C# 中 LINQ 表达式树 (`Expression`) 类型的操作符,它们用于处理布尔逻辑运算,特别是“或者”(OR) 运算。但是它们之间有一些关键区别:
1. `Expression.OrElse` (短路或): 这是一个静态方法,当你需要在表达式树上计算两个值的 OR 并且不需要改变原始变量时使用。如果第一个操作数已经是 true,则不会进一步对第二个操作数求值,因为它已经确定了结果。这对于性能优化尤其有用,避免不必要的计算。
示例:
```csharp
var expr = a ? b : c; // 等同于 Expression.OrElse(a, () => c);
```
2. `Expression.OrAssign` (赋值或): 这个方法用于在一行代码中同时进行赋值和逻辑 OR 操作,适用于你想将某个值与当前值合并的情况,并将结果赋给同一个变量。它会直接更新表达式的左侧引用,而不是创建一个新的表达式。
示例:
```csharp
if (!a)
a = b; // 等同于 Expression.OrAssign(a, b);
```
相关问题
public AsyncTaskExecutor asyncTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); // 核心线程大小 默认区 CPU 数量 taskExecutor.setCorePoolSize(corePoolSize.orElse(CPU_NUM)); // 最大线程大小 默认区 CPU * 2 数量 taskExecutor.setMaxPoolSize(maxPoolSize.orElse(CPU_NUM * 2)); // 队列最大容量 taskExecutor.setQueueCapacity(queueCapacity.orElse(100)); taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); taskExecutor.setWaitForTasksToCompleteOnShutdown(true); taskExecutor.setAwaitTerminationSeconds(awaitTerminationSeconds.orElse(60)); taskExecutor.setThreadNamePrefix(ASYNC_THREAD_NAME_PREFIX); taskExecutor.setTaskDecorator(securityContextTaskDecorator()); taskExecutor.initialize(); return taskExecutor; }
这段代码是用来创建一个异步任务执行器的方法。在这个方法中,我们使用了`ThreadPoolTaskExecutor`来创建线程池。
首先,我们设置了核心线程大小`corePoolSize`,默认是CPU的数量。然后,我们设置了最大线程大小`maxPoolSize`,默认是CPU数量的两倍。接下来,我们设置了队列最大容量`queueCapacity`,默认是100。
接着,我们设置了线程池的拒绝执行处理器为`CallerRunsPolicy`,这意味着当线程池无法接受新的任务时,会由调用者线程来执行该任务。
然后,我们设置了在关闭时等待所有任务完成,并且等待的时间为`awaitTerminationSeconds`,默认是60秒。
接下来,我们设置了线程的名称前缀为`ASYNC_THREAD_NAME_PREFIX`。
然后,我们设置了任务装饰器为`securityContextTaskDecorator()`,这个方法返回一个任务装饰器,用于将安全上下文传递给异步任务。
最后,我们调用了`initialize()`方法来初始化线程池,并将其返回。
这个方法的作用是创建一个配置好的异步任务执行器,并返回给调用者使用。
List<TrCardInfoGatherTemp> cardInfoGatherTempList = trCardInfoGatherTempService.queryTrCardInfoGatherTempByDevId(devIdList); cardInfoGatherTempList.stream().forEach(cardInfoGatherTemp -> { Optional<TrCardInfoGatherTemp> optionalDeviceInfo = Optional.ofNullable(cardInfoGatherTemp); if (optionalDeviceInfo.map(TrCardInfoGatherTemp::getType).orElse("").startsWith("PWR") || optionalDeviceInfo.map(TrCardInfoGatherTemp::getType).orElse("").startsWith("FAN") || optionalDeviceInfo.map(TrCardInfoGatherTemp::getSlot).orElse("").startsWith("FAN") || optionalDeviceInfo.map(TrCardInfoGatherTemp::getSlot).orElse("").startsWith("PWR")) { return; } }); return这部分代码提出来作为公用代码
可以将 Lambda 表达式中的代码提取出来作为一个公用方法,然后在 Lambda 表达式中调用该方法。具体代码如下:
```java
private boolean isPowerOrFan(TrCardInfoGatherTemp cardInfoGatherTemp) {
Optional<TrCardInfoGatherTemp> optionalDeviceInfo = Optional.ofNullable(cardInfoGatherTemp);
return optionalDeviceInfo.map(TrCardInfoGatherTemp::getType).orElse("").startsWith("PWR")
|| optionalDeviceInfo.map(TrCardInfoGatherTemp::getType).orElse("").startsWith("FAN")
|| optionalDeviceInfo.map(TrCardInfoGatherTemp::getSlot).orElse("").startsWith("FAN")
|| optionalDeviceInfo.map(TrCardInfoGatherTemp::getSlot).orElse("").startsWith("PWR");
}
List<TrCardInfoGatherTemp> cardInfoGatherTempList = trCardInfoGatherTempService.queryTrCardInfoGatherTempByDevId(devIdList);
cardInfoGatherTempList.stream().filter(cardInfoGatherTemp -> !isPowerOrFan(cardInfoGatherTemp)).forEach(cardInfoGatherTemp -> {
// TODO: 处理非 PWR 或 FAN 的逻辑
});
```
在上面的代码中,我们将 Lambda 表达式中的代码提取出来作为了 isPowerOrFan 方法。该方法接收一个 TrCardInfoGatherTemp 对象,返回一个 boolean 类型的值。在 Lambda 表达式中,我们首先使用 filter 方法过滤出非 PWR 或 FAN 的对象,并将其传递给 forEach 方法。在 forEach 方法中,我们调用 isPowerOrFan 方法来判断对象是否为 PWR 或 FAN,如果是,则直接返回,不做处理。否则,可以在 TODO 的位置添加处理非 PWR 或 FAN 的逻辑。
阅读全文