标签: java-8

在AtomicBoolean上同步?

在我正在开发的应用程序中,我发现了以下代码片段:

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并且不能期望它会阻塞对象。

我的问题是:重写此方法的正确方法是什么?我已经读过有关将锁对象与布尔属性一起使用的信息,但是为该锁引入两个新属性似乎有点笨拙。

编辑:正如下面的注释中所述:我认为目的是在两个synchronizedAtomicBoolean中不能更改,并且当一个线程位于其中一个synchronized块中时,不能再输入其他任何这样的块。

java multithreading synchronized atomicboolean java-8

2
推荐指数
1
解决办法
159
查看次数

流peek()方法行为

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

java java-8 java-stream

2
推荐指数
1
解决办法
127
查看次数

如何使用Java8流从具有键列表的Map中获取值

我有一个映射“ M”和一个列表“ L”,现在我想使用“ L”中可用的键列表从该映射“ M”中获取值。我想使用Java 8 Stream概念可以有人对此提供帮助。

我编码为打印这些值,但我需要将值放入列表中

list.stream()。forEach(s-> {System.out.println(map.get(s));});

java java-8

2
推荐指数
1
解决办法
55
查看次数

使用流API分组时,多个组中的单个元素

我正在查看一些旧代码,在其中对元素进行分组。看起来或多或少是这样的:

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中的分组替换它,但是我遇到了麻烦。对于我的第二个条件,它工作正常,但是如何处理第一个条件,即应将项添加到接受此类项的每个组中?实际上有可能吗,还是我在这里与失落的原因作斗争?

java java-8 java-stream

2
推荐指数
1
解决办法
79
查看次数

java8 orElse(null.getValue())如何处理

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)

java java-8

2
推荐指数
1
解决办法
92
查看次数

从字符串创建ascii数字字符串

我需要从一个给定的字符串创建一个数字字符串的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

有更有效的方法吗?可能只有一个流?

java java-8 java-stream

2
推荐指数
1
解决办法
58
查看次数

将使用者与不同的参数或不同的参数编号组合

假设我们的方法接收输入 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)

是否可以将不同的消费者合并到一个保护伞下并在一个地方应用?还是这是一个坏主意,而不是正确的方法?

java lambda java-8 functional-interface method-reference

2
推荐指数
1
解决办法
73
查看次数

为什么.filter无法从我的Map &lt;String,Object&gt;中删除空值

我正在尝试从我的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)

期望空值及其键将被删除,但这似乎没有发生。

java linkedhashmap java-8 java-stream

2
推荐指数
1
解决办法
121
查看次数

使用Spock生成测试中的对象列表

我正在编写一个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)

评估解决常规代码的任何帮助。

java groovy spock java-8

2
推荐指数
1
解决办法
56
查看次数

使用Java Stream转换一些逻辑

我想使用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)

java java-8 java-stream

2
推荐指数
1
解决办法
66
查看次数