标签: java-stream

为什么Comparator.comparing不能与String :: toLowerCase方法引用一起使用?

我试图通过反向顺序(忽略大小写)对字符串数组进行排序,而不进行修改,只打印它.所以我使用的是Java8流.但我无法做到这一点.

这是我的尝试:

package experimentations.chapter02;

import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;

public class StringStream {

    public static void main(String[] args) {
        sortStrings();
    }

    public static void sortStrings(){
        String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
        System.out.println(
                Arrays.stream(stringsArray)
                .sorted(Comparator.comparing(String::toLowerCase).reversed())
                .collect(Collectors.toList())
        );
    }

}
Run Code Online (Sandbox Code Playgroud)

这里的问题是String::toLowerCase静态方法不接受Comparator.comparing.

同时,我设法对数组进行排序,但修改它:

public static void sortStrings(){
        String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
        System.out.println(
                Arrays.stream(stringsArray)
                .map(String::toLowerCase)
                .sorted(Comparator.reverseOrder())
                .collect(Collectors.toList())
        );
}
Run Code Online (Sandbox Code Playgroud)

那么,最简​​单的解决方法是什么?

java comparator java-8 java-stream method-reference

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

如何在Stream上短路减少?

假设我有一个布尔值流,我正在编写的reduce操作是||(OR).我能否以一种方式编写它,以便在true遇到值时至少放弃对某些元素的评估?

我正在寻找一些优化(可能是它是一个并行流),不一定是完全优化,虽然后者会很棒.

java java-8 java-stream

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

如何跳过从Files.lines获得的Stream <String>的偶数行

在这种情况下,只有奇数行具有有意义的数据,并且没有唯一标识这些行的字符.我的目的是获得与以下示例等效的内容:

Stream<DomainObject> res = Files.lines(src)
     .filter(line -> isOddLine())
     .map(line -> toDomainObject(line))
Run Code Online (Sandbox Code Playgroud)

没有共享全球状态,有没有"干净"的方式去做?

java-8 java-stream

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

使用Java 8流计算加权平均值

如何计算加权平均值,Map<Double, Integer>其中整数值是要平均的Double值的权重.例如:Map有以下元素:

  1. (0.7,100)//值为0.7,权重为100
  2. (0.5,200)
  3. (0.3,300)
  4. (0.0,400)

我希望使用Java 8流应用以下公式,但不确定如何一起计算分子和分母并同时保留它.如何在这里使用减少?

在此输入图像描述

java java-8 java-stream

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

Java 8 - 类型不匹配:无法从List <Serializable>转换为List <String>

我有一个字符串列表:

List<String> list = Arrays.asList("a1,a2", "b1,b2");
Run Code Online (Sandbox Code Playgroud)

然后转换列表中的所有内容,如:"a1","a2","b1","b2"写道:

List<String> ss1 = list.stream()
                       .flatMap(s -> Stream.of(s.split(",")))
                       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但我有一个错误:"类型不匹配:无法转换List<Serializable>为List<String>".我把问题改成了这个:

List<String> ss2 = list.stream()
                       .flatMap(s -> Arrays.stream(s.split(",")))
                       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Eclipse Neon表明不同之处在于flatMap返回类型.首先flatMap返回List<Serializable>第二个返回a List<String>.

但两者Stream.of()并Arrays.stream()返回<T> Stream<T>(Eclipse的建议,他们都回报Stream<String>).

再次,Stream.of()内部使用(并返回输出)Arrays.stream().那么,第一种情况又是怎么回事呢?

java eclipse arrays java-8 java-stream

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

你会如何在java 8流上进行多项操作?

例如,您有一个要转换为JSONObject的pojo列表.你有一个pojo列表.但是为了转换为JSONObject,您需要使用JSONObject put方法.

JSONObject personJson = new JSONObject();
for(Person person : personList){
   personJson.put("firstName", person.firstName);
   personJson.put("lastName", person.lastname);
   ...
}
Run Code Online (Sandbox Code Playgroud)

如果它只是我想做的一项操作,那么我就可以做到

personList.stream.map(personJson.put("firstName", person.firstName));
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

如何匹配流元素但如果不存在则返回false?

我有一个流,想检查是否所有匹配过滤器.如果全部匹配,则返回true.

但是,如果流是空的,我想回来false.

我怎样才能做到这一点?

示例代码:

public boolean validate(Stream<Whatever> stream) {
  // Problem: returns **true** if stream empty.
  // How can **false** be returned if stream is empty?
  return stream.allMatch(Whatever::someCheck);
}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

使用Java 8 Streams基于常见条件从两个不同的列表创建映射

我有两个这样的列表实例:

List<NameAndAge> nameAndAgeList = new ArrayList<>();
nameAndAgeList.add(new NameAndAge("John", "28"));
nameAndAgeList.add(new NameAndAge("Paul", "30"));
nameAndAgeList.add(new NameAndAge("Adam", "31"));

List<NameAndSalary> nameAndSalaryList = new ArrayList<>();
nameAndSalaryList.add(new NameAndSalary("John", 1000));
nameAndSalaryList.add(new NameAndSalary("Paul", 1100));
nameAndSalaryList.add(new NameAndSalary("Adam", 1200));
Run Code Online (Sandbox Code Playgroud)

这里NameAndAge是

class NameAndAge {
    public String name;
    public String age;

    public NameAndAge(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且NameAndSalary是

private class NameAndSalary {
    private String name;
    private double …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

为什么mapToInt不能与collect(toList())一起使用?

我写了这段代码:

import java.util.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String... args) {
        List<String> a = Arrays.asList("One", "Two", "three");
        List<Integer> lengths = a.stream().mapToInt(String::length).collect(Collectors.toList());

    }
}
Run Code Online (Sandbox Code Playgroud)

但它不想编译,说:

Error:(8, 68) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
  required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
  found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
  reason: cannot infer type-variable(s) R
    (actual and formal argument lists differ in length)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?为什么有限制?如果你使用地图.它没有mapToInt,而是工作正常.

java java-8 java-stream

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

如何在Java中从给定的地图值中查找最新日期

我有下面的值与哈希值映射,在值中我已经日期为字符串数据类型。我想比较地图中所有可用的日期,并仅提取一个具有最近日期的键值。

我想与值而不是键进行比较。

我已包含以下代码

import java.util.HashMap;
import java.util.Map;

public class Test {

  public static void main(String[] args) {

      Map<String, String> map = new HashMap<>();
      map.put("1", "1999-01-01");
      map.put("2", "2013-10-11");
      map.put("3", "2011-02-20");
      map.put("4", "2014-09-09");

      map.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));
    }

}
Run Code Online (Sandbox Code Playgroud)

预期的输出是:

关键4值2014-09-09

java lambda date java-8 java-stream

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