标签: java-stream

Java 8 字符串列表和字符串列表

我想从 Bean 列表生成一个字符串列表,包括 id 和外部 id。

public class User {
    private String id;
    private List<String> externalIds;
}
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码得到了它,但这里我需要进行两次流。

List<User> references = new ArrayList();
Stream.concat(references.stream().map(User::getId),
references.stream().map(User::getExternalIds).flatMap(Collection::stream))
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来重写这段代码?

java java-stream collectors

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

收集器加入传入列表

我有一个接收收集器的方法。收集器应该合并传入列表:

reducing(Lists.newArrayList(), (container, list) -> {
   container.addAll(list);
   return container;
})
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是一个非常常见的场景,我相信 Java 自己的收集器应该有一些东西来涵盖这个用例,但我不记得是什么了。再说了,我还想让它回来ImmutableList。

java java-stream collectors

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

如何使用 forEach 操作将 Map&lt;String,List&lt;String&gt;&gt; 转换为 Map&lt;String,Set&lt;String&gt;&gt;

我想将 a 转换Map<String,List<String>>为Map<String,Set<String>>优化搜索。我想出了下面的传统方法。

 for (Map.Entry<String, List<String>> entry : this.mapWithList.entrySet()) {
        Set<String> hSet = new HashSet<>(entry.getValue());
        this.mapWithSet.put(entry.getKey(), hSet);
   }
Run Code Online (Sandbox Code Playgroud)

forEach我想知道如何在Java 8中使用它。

另外,使用forEachlambda 后,代码性能会更好吗?

java lambda hashmap java-8 java-stream

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

Java流:使用groupingBy而不是列表时如何映射到单个项目

给定一个订单类,例如:

@ToString
@AllArgsConstructor
@Getter
static class Order {
    long customerId;
    LocalDate orderDate;
}
Run Code Online (Sandbox Code Playgroud)

和订单列表:

List<Order> orderList = List.of(new Order(1, LocalDate.of(2020,Month.APRIL,21)),
                                new Order(1, LocalDate.of(2021,Month.APRIL,21)),
                                new Order(1, LocalDate.of(2022,Month.APRIL,21)),
                                new Order(2, LocalDate.of(2020,Month.APRIL,21)),
                                new Order(2, LocalDate.of(2021,Month.APRIL,21)),
                                new Order(3, LocalDate.of(2020,Month.APRIL,21)),
                                new Order(3, LocalDate.of(2022,Month.APRIL,21)),
                                new Order(4, LocalDate.of(2020,Month.APRIL,21)));
Run Code Online (Sandbox Code Playgroud)

我需要获得一份清单,customerId其中列出了最后一次orderDate超过 6 个月的情况。所以对于上面的例子[2,4]。我的想法是首先按 分组customerId,第二个地图到最后orderDate,第三个过滤那些超过 6 个月的地图。我陷入了如何将最近的订单映射到单个订单的第二步orderDate

第一步

Map<Long, List<Order>> grouped =
        orderList.stream()
                .collect(Collectors.groupingBy(Order::getCustomerId));
Run Code Online (Sandbox Code Playgroud)

第二步(卡在这里如何更改上述内容以仅获取一项作为值)

Map<Long, Order> grouped =
        orderList.stream()
                .collect(Collectors.groupingBy(Order::getCustomerId, ???));
Run Code Online (Sandbox Code Playgroud)

甚至更好

Map<Long, LocalDate> grouped =
        orderList.stream()
                .collect(Collectors.groupingBy(Order::getCustomerId, …
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

Java流列表到索引映射

如何从字符串列表中获取映射,其中索引是键,字符串是值?

如果我有这样一个清单

List<String> list = List.of("foo","bar","baz","doo");
Run Code Online (Sandbox Code Playgroud)

我想要得到一个Map<Integer,String>喜欢

{0=foo, 1=bar, 2=baz, 3=doo}
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时出现错误

static Map<Integer,String> mapToIndex(List<String> list) {
    return IntStream.range(0, list.size())
            .collect(Collectors.toMap(Function.identity(), i -> list.get(i)));
}
Run Code Online (Sandbox Code Playgroud)

错误

所需类型:int 提供:Object

当我将其转换为 int 或 Integer 时

static Map<Integer,String> mapToIndex(List<String> list) {
    return IntStream.range(0, list.size())
            .collect(Collectors.toMap(Function.identity(), i -> list.get((Integer) i)));
}
Run Code Online (Sandbox Code Playgroud)

我明白了

'java.util.stream.IntStream' 中的 'collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer<R,R>)' 无法应用于 '(java .util.stream.Collector<java.lang.Object,capture<?>,java.util.Map<java.lang.Object,java.lang.String>>)'

我缺少什么?

java java-stream

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

无法分配接收通用 List 并返回 List&lt;?&gt; 的方法返回的结果

我正在尝试过滤实现接口的对象列表。我正在尝试为所有类创建一个通用方法。

就像是:

interface SomeInterface {
    String getFlag();
}


class SomeObject implements SomeInterface {
    public String getFlag() {
        return "X";
    }
}


List<SomeObject> someObjectList = new ArrayList<>();

// Compilation error here
List<SomeObject> filterList = filterGenericList(someObjectList, "X");


private List<?> filterGenericList(List<? extends SomeInterface> objects, String flag) {
        return objects.stream()
                .filter(it -> it.getFlag().equals(flag))
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

如何避免编译错误?

 Incompatible types. 
 Found: 'java.util.List<capture<?>>', 
 Required: 'java.util.List<SomeObject>'
Run Code Online (Sandbox Code Playgroud)

java generics list unbounded-wildcard java-stream

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

使用流将 Map 转换为排序的 TreeSet

代码是:

public TreeSet<VehicleTransportation> allVehicleTransportations(){
        
        Set<VehicleTransportation> sortedVehicles = allVehicleTransportation.entrySet().stream()
                .sorted(Comparator.comparing(Map.Entry::getValue.pollutionLevel , Comparator.reverseOrder()))
                .sorted(Comparator.comparing(Map.Entry::getValue.price))
                .map(Map.Entry::getValue)
                .collect(Collectors.toSet());

        return sortedVehicles;
    }
Run Code Online (Sandbox Code Playgroud)

HashMap 在哪里

HashMap<String, VehicleTransportation> allVehicleTransportation = new HashMap<String, VehicleTransportation>();
Run Code Online (Sandbox Code Playgroud)

我使用这段代码遇到了两个问题。首先,由于某种原因Map.Entry::getValue遇到错误: The target type of this expression must be a functional interface 我认为这里的问题是比较器无法在两个类型的对象之间进行比较,VehicleTransportation尽管 pollutionLevel和price都是字符串。

其次,我不太清楚如何将 Set 转换为 TreeSet (也许使用(TreeSet<VehicleTransportation>)?)

java java-stream

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

Java Stream:在reduce()操作中解析字符串

我有一个字符串流:

Stream<String> st = Arrays.stream(new String[]{"10", "20", "30",  "40", "50"});
Run Code Online (Sandbox Code Playgroud)

我想将它们转换为整数并使用该方法对它们进行求和reduce。我使用以下格式的reduce:

int result = st.reduce(0, (a, b) -> a + Integer.parseInt(b));
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

no suitable method found for reduce(int, (a, b) -> a + [...]nt(b))
Run Code Online (Sandbox Code Playgroud)

有关如何重写reduce 方法以使其工作的任何提示吗?

java string java-stream

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

从集合中删除列表中存在的项目 - 流

我试图从集合(HashSet)中删除一些对象,但前提是它们也存在于列表(LinkedList)中。如何使用 Java 8+ 功能(流)来实现这一目标。

Set<MyObject> theSet -> want to remove items that are present in the list

List<MyObject> theList
Run Code Online (Sandbox Code Playgroud)

我已经覆盖了 MyObject 的 equals 和 hashcode(仅使用几个字段来比较相等性)。

java algorithm java-stream

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

从 int 数组创建映射 - 运算符“%”不能应用于“java.lang.Object”

我有这样的代码,它应该Map从整数数组创建一个。键代表位数。​

public static Map<Integer, List<String>> groupByDigitNumbersArray(int[] x) {
    return Arrays.stream(x)  // array to stream
        .filter(n -> n >= 0) // filter negative numbers
        .collect(Collectors.groupingBy(n -> Integer.toString((Integer) n).length(), // group by number of digits
            Collectors.mapping(d -> (d % 2 == 0 ? "e" : "o") + d,
                Collectors.toList()))); // if even e odd o add to list
}
Run Code Online (Sandbox Code Playgroud)

问题与 一致mapping()。我收到错误:

public static Map<Integer, List<String>> groupByDigitNumbersArray(int[] x) {
    return Arrays.stream(x)  // array to stream
        .filter(n …
Run Code Online (Sandbox Code Playgroud)

java arrays java-stream collectors

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