标签: java-8

Java如何使用locale对字段进行排序?

我试图通过具有特定区域设置的字段对列表进行排序.我如何结合以下陈述?

names.stream().sorted(Comparator.comparing(AClass::getName)).collect(Collectors.toList());

Collator coll = Collator.getInstance(new Locale("tr","TR"));
coll.setStrength(Collator.PRIMARY);
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

java 8 parallel stream问题

    _logger.info("data size : "+saleData.size);

    saleData.parallelStream().forEach(data -> {
                SaleAggrData saleAggrData = new SaleAggrData() {
                    {
                        setCatId(data.getCatId());
                        setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue()));
                        setMargin(RoundUpUtil.roundUpDouble(data.getMargin()));
                        setUnits(data.getUnits());
                        setMarginRate(ComputeUtil.marginRate(data.getRevenue(), data.getMargin()));
                        setOtd(ComputeUtil.OTD(data.getRevenue(), data.getUnits()));
                        setSaleDate(data.getSaleDate());
                        setDiscountDepth(ComputeUtil.discountDepth(data.getRegularPrice(), data.getRevenue()));
                        setTransactions(data.getTransactions());
                        setUpt(ComputeUtil.UPT(data.getUnits(), data.getTransactions()));
                    }
                };
                salesAggrData.addSaleAggrData(saleAggrData);
            });
Run Code Online (Sandbox Code Playgroud)

代码的问题是当我从DB获得响应时,并且在使用并行流进行迭代时,每次数据大小都不同,而使用顺序流时,它工作正常.

我不能使用顺序Stream因为数据很大并且需要时间.

任何领导都会有所帮助.

java parallel-processing java-8 parallel.foreach

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

如何在Java中有效地连接ArrayList中的连续字符串间隔?

假设我有一个ArrayList<String>500的大小,然后我想有效地连接索引(从1开始)的字符串:1-100,101-200,...,401-500字符串(所以我想得到5个字符串而不是500).我以为我可以使用StringBuilder,然后使用.toString,但.toString()方法StringBuilder创建一个新字符串,所以有效地我将创建5 * 2 = 10的字符串这是坏的(这些字符串是真正巨大的,我很短的空间).什么是最好的内存和时间有效的方法呢?

到目前为止我尝试过的:

有一个错字:我的意思是StringBuilder代替StringBuffer.我使用了StringBuilder一个简单的for循环ArrayList<String>.所以我使用了3x空间(1x - 初始ArrayList,2x - for StringBuilder,3x - 当sb.toString()有效创建返回时调用new String(value, 0, count);)

java stringbuilder java-8

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

Java 8中try-with-resources块中的锁的风险

如果我做

try(Lock lock = lockProvider.lock()) {
    // some code that doesn't use variable lock
}
Run Code Online (Sandbox Code Playgroud)

编译器或JITer是否存在删除锁创建的风险,因为它在块中看到它未使用?


后来编辑:

一点背景.我来自.NET背景,在C#中,它允许执行以下操作:

using(Transaction tx = BeginTransaction())
{
    // code that does things without touching the tx variable, such as SQL connections and stuff
}
Run Code Online (Sandbox Code Playgroud)

事实上它甚至可以缩短为

using(BeginTransaction())
{
    // code that does things without touching the tx variable, such as SQL connections and stuff
}
Run Code Online (Sandbox Code Playgroud)

静态编译器和JIT编译器将保持BeginTransaction调用,并且在运行时它将始终发生.

然而,在Java似乎是一个很大的问题和消极周围使用try-与资源用于其他的东西,是资源.

java optimization jit java-8 javacompiler

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

Java 8 - Streams API - 在LIST上运行

我有一个ArrayList,其中包含以下内容 - CHENNAI,MUMBAI,DELHI,CHENNAI,DELHI,CHENNAI.此外,假设这3个城市名称被定义为具有针对每个城市的值的ENUM.(CHENNAI = 1,MUMBAI = 2和DELHI = 3)

我的Java 8 Streams,我能够计算城市值的总和,在这种情况下,它将是1 + 2 + 3 + 1 + 3 + 1 = 11.

问题是,如果有一个额外的标准,我怎么能计算相同ArrayList的城市值之和,

如果城市名称出现两次,则必须仅添加一次.即在这种情况下,CHENNAI存在3次.因此,当添加其值时,我们应该只考虑1(对于前2次出现)+ 1 = 2而不是3.同样,DELHI出现2次.因此,德里的价值应该只采取一次.因此,如前所述,最终结果将是2 + 2 + 3 = 7而不是11.

请帮助如何在Java 8中实现这一点

java java-8 java-stream

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

为什么同步块给出了错误的答案?

我正在努力学习同步.根据我学到的东西卡在这里下面的代码应该给8000作为最终结果,但我得到一个随机的结果,如下面的
包线程;

import java.time.LocalDateTime;

public class A implements Runnable {
    String name;
    static Integer j=0;
    A(String name){
        this.name=name;
    }
    @Override
    public synchronized void  run() {
        for(int i=1;i<=1000;i++){
            synchronized(this){
            A.j++;
            }
        }
        System.out.println(j);
    }

package threads;

public class MainClass {
public static void main(String args[]){
    Thread t1=new Thread(new A("i am thread A "));
    Thread t2=new Thread(new A("i am thread B "));
    Thread t3=new Thread(new A("i am thread C "));
    Thread t4=new Thread(new A("i am thread D "));
    Thread t5=new Thread(new A("i …
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization java-8

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

构造函数引用和调用构造函数的lambda表达式之间有什么区别?

我正在研究Java 8中的Stream API,我遇到了一个问题.问题是我试图理解 以下代码之间()->new StringBuilder和 之间的差异StringBuilder::new:

Stream<String> stream = Stream.of(new String[]{"b", "a", "s", "i", "l",});
StringBuilder basil = stream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
System.out.println("basil");
Run Code Online (Sandbox Code Playgroud)

Stream<String> stream = Stream.of(new String[]{"b", "a", "s", "i", "l",});
    StringBuilder basil = stream.collect(()->new StringBuilder(), StringBuilder::append, StringBuilder::append);
    System.out.println("basil");
Run Code Online (Sandbox Code Playgroud)

我何时应该使用第一种语法,何时应该选择第二种语法?

为什么上面的代码接受StringBuilder::append并且不接受StringBuilder::reverse

java java-8 java-stream

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

增强的For循环不会在数组中添加元素

我正在尝试使用增强的for循环来添加数组中的元素.如果我使用正常的for循环,它可以工作.但是,当我使用增强的for循环时,它会引发IndexOutOfBounds异常,我不确定为什么会发生这种情况?

int[ ] array = {1,2,3};
int total = 0; 
for(int counter : array) {
    total = total + array[counter];
}
System.out.println(total);
Run Code Online (Sandbox Code Playgroud)

java java-8

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

即使Optional包含值,也会调用Optional.orElse的参数

下面的代码打印:

should Not have called
hello world
Run Code Online (Sandbox Code Playgroud)

为什么orElse即使有包含值的Optional也要执行?

public static void main(String[] args){
    String o = Optional.ofNullable("world").map(str -> "hello" + str).orElse(dontCallMe());
    System.out.println(o);
}

private static String dontCallMe() {
    System.out.println("should Not have called");
    return "why god why";
}
Run Code Online (Sandbox Code Playgroud)

java optional java-8

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

使用Switch,减少圈复杂度java

在使用java时我遇到了一个奇怪的情况,让我们先从代码开始.

public static String constructMessage(final String reason, final String xId,
        final String yId, final IonStruct metadataStruct) throws DataSanityException {
    String message = "";
        switch (reason) {
            case "NOT_ACTIVE":
                if (xId != null) {
                    message = String.format("Y %s X %s not active: status is inactive%n", yId, xId);
                } else {
                    message = String.format("Y %s not active: status is inactive%n", yId);
                }
                break;
            case "PRICE_GONE":
                if (metadataStruct.containsKey("applied")) {
                    final String applied = metadataStruct.get("applied");
                    if (applied.equals("single")) {
                        message = String.format("X %s is not …
Run Code Online (Sandbox Code Playgroud)

java oop java-8

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