在我正在开发的应用程序中,我发现了以下代码片段:
public class MyClass {
private AtomicBoolean atomicBoolean = new AtomicBoolean(false);
public void Execute() {
// Whole lot of business logic
// ....
synchronized (this.atomicBoolean) {
// Want to make sure that execution is stopped if Stop() was called
if (this.atomicBoolean.get()) {
throw new SpecificException("...");
}
// Some more business logic...
}
}
public void Stop() {
synchronized (this.atomicBoolean) {
this.atomicBoolean.set(true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据FindBugs的说法,这是不正确的,因为我不能与AtomicBoolean一起使用,synchronized并且不能期望它会阻塞对象。
我的问题是:重写此方法的正确方法是什么?我已经读过有关将锁对象与布尔属性一起使用的信息,但是为该锁引入两个新属性似乎有点笨拙。
编辑:正如下面的注释中所述:我认为目的是在两个synchronized块AtomicBoolean中不能更改,并且当一个线程位于其中一个synchronized块中时,不能再输入其他任何这样的块。
List<Integer> nums = Arrays.asList(1,2,3,4,5,6);
long result = nums
.stream()
.peek(System.out::print)
.map(n->n*n)
.filter(n->n>20)
.peek(System.out::print)
.count();
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
为什么不打印12345625362而不是打印1234525362?
我有一个映射“ M”和一个列表“ L”,现在我想使用“ L”中可用的键列表从该映射“ M”中获取值。我想使用Java 8 Stream概念可以有人对此提供帮助。
我编码为打印这些值,但我需要将值放入列表中
list.stream()。forEach(s-> {System.out.println(map.get(s));});
我正在查看一些旧代码,在其中对元素进行分组。看起来或多或少是这样的:
Map<Long,List<Items>> groupedItems = ...
for (long groupid : groups){
for (Item item :items){
if (isGroupAccepting(item.getId(),groupid) || groupid == item.getGroup()) {
groupedItems.get(groupid).add(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我计划使用流API中的分组替换它,但是我遇到了麻烦。对于我的第二个条件,它工作正常,但是如何处理第一个条件,即应将项添加到接受此类项的每个组中?实际上有可能吗,还是我在这里与失落的原因作斗争?
elseCondition当前抛出空值时是否可以在一行中写nullPointer
在我的场景中,returnValue是一个String,它为null。
我要写的条件是
if (returnValue != null) {
return returnValue;
} else if (elseCondition != null) {
return elseCondition.getValue();
} else {
return null;
}
Optional.ofNullable(returnValue).orElse(elseCondition.getValue()) //throws nullPointer as elseCondition is null
class ElseCodnition {
private String value;
getValue() {...}
}
Run Code Online (Sandbox Code Playgroud) 我需要从一个给定的字符串创建一个数字字符串的ascii值。我的字符串仅包含大写的AZ字符。
目前,我有:
String example = "STRING";
List<Integer> list = example.chars()
.mapToObj(item -> (int) item)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
输出: [83, 84, 82, 73, 78, 71]
比我做的:
String asciiString = list.stream()
.map( n -> n.toString() )
.collect( Collectors.joining( "" ) );
Run Code Online (Sandbox Code Playgroud)
输出: 838482737871
有更有效的方法吗?可能只有一个流?
假设我们的方法接收输入 String并返回一些List output。此输出是一些生成器的结果,其中一些生成器取决于输入,而有些则不取决于输入-它们只是添加预定义的值。我想将这些生成器实现为一些函数接口的列表(例如,Consumer),然后将它们组合到一个Consumer中,然后将其应用于输入String。
因此,我将能够轻松,独立地更换小型发电机。但是问题在于,并非我的所有生成器都需要输入 String作为参数,而我只是出于一个原因就将这个参数传递给了它-能够将此类使用者与其他使用者组合在一起。
public class ConsumersTest {
private static <T, U> BiConsumer<T, U> combine(List<BiConsumer<T, U>> consumers) {
return consumers.stream().reduce((arg1, arg2) -> {}, BiConsumer::andThen);
}
List<String> generate(String input) {
ArrayList<String> output = new ArrayList<>();
combine(getGenerators()).accept(input, output);
return output;
}
private List<BiConsumer<String, List<String>>> getGenerators() {
return Arrays.asList(
this::addFirstDependent,
this::addSecondIndependent
);
}
private void addFirstDependent(String input, List<String> output) {
if (input.contains("some string")) {
output.add("First-Dependent");
}
}
private void addSecondIndependent(String input, List<String> output) {
output.add("Predefined Output");
}}
Run Code Online (Sandbox Code Playgroud)
是否可以将不同的消费者合并到一个保护伞下并在一个地方应用?还是这是一个坏主意,而不是正确的方法?
我正在尝试从我的LinkedHashMap中过滤出不必要的null值。但是,实际上并没有删除这些值。
变量声明
Map<String,Object> dataDictionary = new LinkedHashMap<>();
Run Code Online (Sandbox Code Playgroud)
使用filter方法后,在sysout.print(dataDictionary)返回的内容的一小部分。
[industryCodes=<null>,regionCodes=<null>,andKeywords=false,id=
<null>,resultsPerPage=20,keywords=<null>,omitKeywords=<null>}
Run Code Online (Sandbox Code Playgroud)
Java代码
dataDictionary= dataDictionary.entrySet()
.stream()
.filter(entry -> entry.getValue()!=null)
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)
期望空值及其键将被删除,但这似乎没有发生。
我正在编写一个spock测试,其中我需要生成一些测试数据(固定装置)。我知道如何用Java完成它,但是无法在spock(groovy)中实现它。
我是groovy的新手,因此我提供了Java实现
Java实现如下:
List<Employee> employees= LongStream.range(1, 70).mapToObj(id -> {
Employee emp = new Employee ();
emp.setEmployeeId(id);
return emp ;
}).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用groovy实现相同的功能,但无法正确完成。
def employees = [1..70].each { id ->
def emp = new Employee()
emp.setEmployeeId(id)
employees << emp
}
Run Code Online (Sandbox Code Playgroud)
评估解决常规代码的任何帮助。
我想使用Java8 Stream转换一些逻辑。我们应该如何修改代码?
public boolean isBFOrder(final BFReturn pReturnRequest) {
ArrayList<BFReturnShip> shipGroupList =pReturnRequest.getShipGroupList();
Boolean bfOrder = false;
for(BFReturnShip bfReturnShip : shipGroupList) {
if(bfReturnShip.getModeOfReturn().equals(TYPE)) {
bfOrder = true;
} else {
return false;
}
}
return bfOrder;
}
Run Code Online (Sandbox Code Playgroud)