标签: java-stream

在考虑并行化外部流之前,是否会完全并行处理内部并行流?

从这个链接,我只是部分理解,至少在某些时候,java嵌套并行流存在问题.但是,我无法推断出以下问题的答案:

假设我有一个外部srtream和一个内部流,两者都使用并行流.事实证明,根据我的计算,如果内部流首先完全并行完成,那么它将更高效(由于数据位置,即L1/L2/L3 CPU缓存中的缓存)(如果且仅cpu核心可用)做外部流.我认为这对大多数人的情况都是如此.所以我的问题是:

Java会首先并行执行内部流,然后在outerstream上工作吗?如果是这样,它是在编译时还是在运行时做出决定?如果在运行时,JIT甚至足够聪明地意识到如果内部流确实具有比核心数量(32)更多的元素(例如数百个),那么它肯定应该使用所有32个内核来处理在从外部流移动下一个元素之前的内部流; 但是,如果元素的数量很小(例如<32),则可以"并行处理"来自"下一个"外部流的元素的元素.

java concurrency java-8 forkjoinpool java-stream

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

使用Java 8 Optional <T>,Stream循环遍历包含真实布尔字段值的对象列表

我被告知不要.anyMatch(Predicate.isEqual(true))被同事使用.原因是,它不是无效的.他们建议我应该使用Optional<Boolean>.

我有一个帐户列表,我想true只有在帐户有未偿还的活跃贷款时才返回布尔值,否则返回false.

@Data
public class Account {
    private String accountNumber;
    @Getter(AccessLevel.NONE)
    private Boolean activeLoan;
    private String accountReference;
    private Double balance;
    private String status;

    public Boolean hasActiveLoan() {
        return activeLoan;
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,只有当hasActiveLoan()等于真时.

以下是我提出的解决方案:

 Boolean checkActiveLoanRule(List<Account> accounts) {

         Optional<Boolean> loanAccountExists = Optional.of(accounts.stream()
                .map(Account::hasActiveLoanAccount)
                .anyMatch(Predicate.isEqual(true)));

         return loanAccountExists.equals(Optional.of(true));
     }
Run Code Online (Sandbox Code Playgroud)

这可以重构以某种方式改进吗?还有其他想法吗?

最重要的是,这样的解决方案是线程安全的吗?

java lambda optional java-8 java-stream

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

在一个java流lambda函数中求和不同的值

我有一个用例需要在这个对象中总结不同的字段,所以我这样编码,我可以把它放在一个流中吗?

int totalUnits = records.stream()
        .mapToInt(DynamoSalesAggregateSummaryRecord::getUnits).sum();
int totalReturns = records.stream()
        .mapToInt(DynamoSalesAggregateSummaryRecord::getReturns).sum();
int totalCancellations = records.stream()
        .mapToInt(DynamoSalesAggregateSummaryRecord::getCancellations).sum();
BigDecimal totalRevenue = records.stream()
        .map(DynamoSalesAggregateSummaryRecord::getRevenue)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalRoyalties = records.stream()
        .map(DynamoSalesAggregateSummaryRecord::getRoyalties)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

使用Java 8流的大小为n到数组nx 2的数组

我试图找出一个简单的转换的最优雅的方式int排列(例如{1, 2, 3}),以一个简单的String阵列(例如,{"id", "1", "id", "2", "id", "3"}使用Java 8流串对).

传统上代码如下: -

int[] input = {1, 2, 3};

String[] output = new String[input.length * 2];

int i = 0;
for (int val : input) {
    output[i++] = "id";
    output[i++] = String.valueOf(val);
}
Run Code Online (Sandbox Code Playgroud)

但假设这可以在Java 8中用1-liner完成.

arrays java-8 java-stream

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

Java 8 Streaming Filter&Collect是否返回对列表中相同对象的引用?

例如,考虑下面的代码

List<Reference> references = context.getReferences()
                .stream()
                .filter(ref -> ref.getCondition() == SOMETHING_DESIRABLE)
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

现在,如果我改变引用列表中的每个引用,它是否会反映在原始context.references中?

java reference java-stream

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

Java 8:如何使用ArrayList对两个嵌套的Maps进行排序和收集?

我有一个以下类型的嵌套Map LinkedHashMap<String, LinkedHashMap<String, ArrayList<Commit>>>.第一个映射的键存储一些用户名,第二个映射的键是用户的存储库名称,在ArrayList内部我有一个对象,其中包含一些属性,如哈希,消息,添加等.

在我按照第一张地图的键和第二张地图的键按字母顺序排序整个集合后,我如何在相同类型的新集合中收集(保存)我的嵌套地图(对象保持不变)?

我需要使用lambda和Stream API来做到这一点.这是我试图这样做的方式:

LinkedHashMap<String, LinkedHashMap<String, ArrayList<Commit>>> sorted = gitUsers.entrySet()
            .stream()
            .sorted((u1, u2) -> u1.getKey().compareTo(u2.getKey()))
            .map(u -> u.getValue()
                    .entrySet()
                    .stream()
                    .sorted((r1, r2) -> collator.compare(r1.getKey(), r2.getKey())))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(a, b) -> a, LinkedHashMap::new));
Run Code Online (Sandbox Code Playgroud)

我肯定做错了,因为我不断收到以下消息"无法从静态上下文中引用非静态方法"并且无法收集地图.我想我无法成功组装我的地图因为.map()我使用的功能和第二个流.

我知道你会建议我使用TreeMap或者使用.foreach()我的lambda中的方法对它进行排序并立即打印(顺便提一下我已经做过),但我需要像上面描述的那样完全按照这种方式进行排序..

出于我的编程基础课程的目的,这个问题应该以这种方式解决.希望对你有所帮助!

PS我一直在寻找解决方案很长一段时间,并在各地进行研究,包括Stack Overflow论坛,并没有找到任何对应于所要求的解决问题的方法.

java lambda hashmap java-8 java-stream

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

Kotlin和parallelStream toArray

我想我已经陷入困境。由于性能原因,我正在尝试利用Java parallelStream。

函数Specimen.pick()采样并返回Specimen的实例。我想在替换pool时使用parallelStream对此进行并行化。

var pool: Array<Specimen> = Array(100_000) .. 
Run Code Online (Sandbox Code Playgroud)

这就是我要在Kotlin中编写的内容:

pool = pool.asList().parallelStream().map { Specimen.pick(pool, wheel, r.split()) }.toArray(Specimen::new)
Run Code Online (Sandbox Code Playgroud)

:: new出现了哪些错误

相反,我不得不在列表和数组之间来回移动:

pool = pool.asList().parallelStream().map { Specimen.pick(pool, wheel, r.split()) }.collect(Collectors.toList()).toTypedArray()
Run Code Online (Sandbox Code Playgroud)

哪个可行,但似乎浪费资源,而不是直接进入Array。如果我让IntelliJ尝试Kotlinize这样的Java示例:

Java:

Person[] men = people.stream()
                      .filter(p -> p.getGender() == MALE)
                      .toArray(Person[]::new);
Run Code Online (Sandbox Code Playgroud)

IntelliJ转换:

val men = people.stream()
            .filter({ p -> p.getGender() === MALE })
            .toArray(Person[]::new  /* Currently unsupported in Kotlin */)
Run Code Online (Sandbox Code Playgroud)

所以也许这是科特林来的?还是还有另一种更好的方法?

kotlin java-stream

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

Java 8可选,用于在分层对象中执行空检查

对对象使用“空检查”选项克隆不同类型的对象。

class A{ C cObj, List<B> bList;}

class B{ C cObj; List<C> cList;}

class C { String label; String value;}

class D{ String name; String age; String addressCode;}
Run Code Online (Sandbox Code Playgroud)

映射A-> D

d.setAddessCode(A.getBlist().get(0).getcList().get(0).getValue());
Run Code Online (Sandbox Code Playgroud)

如何使用Java 8可选检查null

A.getBlist().get(0).getcList().get(0).getValue()
Run Code Online (Sandbox Code Playgroud)

我试过了

d.setAddessCode(Optional.ofNullable(A).map(A::getBList).map(Stream::of).orElseGet(Stream::empty).findFirst().map(B::getCList).map(Stream::of).orElseGet(Stream::empty).findFirst().map(C::getValue).orElse(null)));
Run Code Online (Sandbox Code Playgroud)

我如何才能一起检查列表和值中的null。

java object optional java-8 java-stream

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

Lambda没有解析类型

我看到一个奇怪的问题,eclipse并没有识别我的lambda参数

public static void main(String[] args) {
    int[] array = {23,43,56,97,32};
    int sum1 = Arrays.asList(array).stream().reduce(0, (total, e) -> total + e).intValue(); 
}
Run Code Online (Sandbox Code Playgroud)

我得到total并且e无法解决变量.
我看到'total'和'e'被用作参数而没有声明的例子.
但是,在我的情况下 - 它拒绝编译而不声明.
这是什么问题?

java lambda java-stream

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

Java Stream Sort - 具有2个或更多对象标准的比较器

问题:我正在尝试检查是否可以使用2个或更多条件对列表(数据类型为Object的ArrayList)进行排序.请注意我知道使用Comparator with thenComparing功能.我希望检查是否有一种方法可以使用2个或更多标准进行排序,而无需使用自定义数据类型,我可以轻松使用比较器功能.对于1个标准排序,以下代码有效.

在这种情况下,如果我执行以下操作,IntelliJ IDE会立即给出错误 - '无法解析方法'get(int)'for o.get(3)

.sorted(Comparator.comparing(o -> o.get(3).toString()).thenComparing(...)
Run Code Online (Sandbox Code Playgroud)

我在这个论坛示例中也提到了很多线程 - Link1 Link2

代码(适用于单一标准)

List<List<Object>> listOutput = new ArrayList<>();
.........
.........
listOutput = listOutput
                    .stream()
                    .sorted(Comparator.comparing(o -> o.get(3).toString()))
                    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

添加(对象细节)

(注意)

String dataType - exchange,broker,segment,coCode

LocalDate dataType - tradeDate

LocalTime dataType - tradeTime

double dataType - sellPrice,buyPrice

List<Object> lineOutput = new ArrayList<>();
lineOutput.add(exchange);
lineOutput.add(broker);
lineOutput.add(segment);
lineOutput.add(tradeDate);  // Entry Date
lineOutput.add(tradeTime);   // Entry Time
lineOutput.add(coCode);
lineOutput.add(sellPrice - buyPrice);   // Profit / Loss 
listOutput.add(lineOutput); // Add line …
Run Code Online (Sandbox Code Playgroud)

java comparator java-stream

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