小编Tag*_*eev的帖子

Java 8:从List中查找最小值索引

说我有一个包含元素的列表(34, 11, 98, 56, 43).

使用Java 8流,如何找到列表中最小元素的索引(例如,在这种情况下为1)?

我知道这可以在Java中轻松完成list.indexOf(Collections.min(list)).但是,我正在寻找一个类似Scala的解决方案,我们可以简单地说List(34, 11, 98, 56, 43).zipWithIndex.min._2获得最小值的索引.

有没有什么可以使用流或lambda表达式(比如Java 8特定功能)来实现相同的结果.

注意:这仅用于学习目的.我在使用Collections实用程序方法时没有任何问题.

java java-8 java-stream

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

为什么java中BitSet的内部数据存储为long []而不是Java中的int []?

在java中,BitSet的内部数据存储为long []而不是int [],我想知道为什么?这是jdk中的代码:

 /**
 * The internal field corresponding to the serialField "bits".
 */
 private long[] words;
Run Code Online (Sandbox Code Playgroud)

如果这完全取决于性能,我想知道为什么long []存储会获得更好的性能.

java performance bitset

13
推荐指数
3
解决办法
1353
查看次数

使用并行流返回最快的提供值

我有一组供应商,它们都有相同的结果,但速度不同(且不同).

我想要一种优雅的方式同时启动供应商,并且只要其中一个产生了价值,就将其退回(丢弃其他结果).

我已经尝试过使用并行流,Stream.findAny()但是它总是会阻塞,直到产生所有结果.

这是一个单元测试,展示了我的问题:

import org.junit.Test;

import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Stream;

import static org.junit.Assert.*;

public class RaceTest {

    @Test
    public void testRace() {
        // Set up suppliers
        Set<Supplier<String>> suppliers = Collections.newSetFromMap(new ConcurrentHashMap<>());
        suppliers.add(() -> "fast"); // This supplier returns immediately
        suppliers.add(() -> {
            try {
                Thread.sleep(10_000);
                return "slow";
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }); // This supplier takes 10 seconds to produce a value

        Stream<Supplier<String>> stream = …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing multithreading java-8 java-stream

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

在Java8函数样式中,如何将值映射到现有的键值对

我有一张地图:

Map<String, List<Object>> dataMap;
Run Code Online (Sandbox Code Playgroud)

现在我想向地图添加新的键值对,如下所示:

if(dataMap.contains(key)) {
    List<Object> list = dataMap.get(key);
    list.add(someNewObject);
    dataMap.put(key, list);
} else {
    List<Object> list = new ArrayList();
    list.add(someNewObject)
    dataMap.put(key, list);
}
Run Code Online (Sandbox Code Playgroud)

我如何使用Java8功能样式?

java dictionary java-8

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

在顺序排序的流中查找缺少的整数

假设我有一个清单

ArrayList<String> arr = new ArrayList(Arrays.asList("N1", "N2", "N3", "N5"));
Run Code Online (Sandbox Code Playgroud)

我怎么找到"N4",我的意思是,我怎么发现丢失的整数是4?

到目前为止我尝试过的

Integer missingID = arr.stream().map(p -> Integer.parseInt(p.substring(1))).sorted()
                .reduce((p1, p2) -> (p2 - p1) > 1 ? p1 + 1 : 0).get();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为reduce在这种情况下不打算以我需要的方式工作,实际上,我不知道怎么做.如果没有丢失的数字,则必须是下一个"N6" - or just 6 -(在此示例中)

它必须使用java标准流的库,不使用第三方.

java java-8 java-stream

13
推荐指数
3
解决办法
2432
查看次数

如何使用Stream API java 8一起打印两个列表?

我有两个列表如下

List<String> names = Arrays.asList("James","John","Fred");
List<Integer> ages = Arrays.asList(25,35,15);
Run Code Online (Sandbox Code Playgroud)

我想要做的就是打印这两个列表

James:25
John:35
Fred:15
Run Code Online (Sandbox Code Playgroud)

使用经典方式很容易做到

for(int i=0;i<names.size();i++){
    System.out.println(names.get(i)+":"+ages.get(i));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Stream API java 8?

我能做的是只打印一个列表

names.stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

如何检查null是否在流中?

我有一个Stream<Integer>,想知道null这个流中是否有.我该如何检查?使用.anyMatch(null)抛出我java.lang.NullPointerException.

java nullpointerexception java-8 java-stream

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

String.substring()生成基础char []值的副本

有关性能考虑因素的问题String.substring.在Java 1.7.0_06之前,该String.substring()方法返回一个新String对象,该对象与其父对象共享相同的底层char数组,但具有不同的偏移量和长度.为了避免在只需要保留一个小子字符串时在内存中保留一个非常大的字符串,程序员习惯于编写如下代码:

s = new String(queryReturningHugeHugeString().substring(0,3));
Run Code Online (Sandbox Code Playgroud)

从1.7.0_06开始,没有必要创建一个新的,String因为在Oracle的实现中String,子串不再共享它们的底层char数组.

我的问题是:我们可以依赖Oracle(以及其他供应商)不再回到char[]未来的版本中共享,而只是这样做s = s.substr(...),或者我们是否应该显式创建一个新的String,以防JRE的未来版本开始使用共享实现再次?

java string

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

Java中的无限流并行处理

为什么下面的代码不打印任何输出,而如果我们删除并行,它打印0,1?

IntStream.iterate(0, i -> ( i + 1 ) % 2)
         .parallel()
         .distinct()
         .limit(10)
         .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

虽然我知道理想的限制应该放在不同之前,但我的问题更多地与添加并行处理引起的差异有关.

java parallel-processing java-8 java-stream

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

Java 8 Stream:使用多个收集器进行分组

我想通过一个分类器使用Java 8 Stream和Group,但是有多个Collector函数.因此,在分组时,例如计算一个场(或可能是另一个场)的平均值和总和.

我尝试用一​​个例子来简化这一点:

public void test() {
    List<Person> persons = new ArrayList<>();
    persons.add(new Person("Person One", 1, 18));
    persons.add(new Person("Person Two", 1, 20));
    persons.add(new Person("Person Three", 1, 30));
    persons.add(new Person("Person Four", 2, 30));
    persons.add(new Person("Person Five", 2, 29));
    persons.add(new Person("Person Six", 3, 18));

    Map<Integer, Data> result = persons.stream().collect(
            groupingBy(person -> person.group, multiCollector)
    );
}

class Person {
    String name;
    int group;
    int age;

    // Contructor, getter and setter
}

class Data {
    long average;
    long sum;

    public Data(long average, long …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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