标签: java-stream

Lambda Expression创建一个以Integer为键,List为值的地图

问题:通过lambda表达式解决以下问题.给定一个字符串列表,创建一个地图

Key=Integer(string.length)
value=List
Run Code Online (Sandbox Code Playgroud)

如果两个字符串与长度匹配,则创建所有此类匹配字符串长度的列表.

我不知道如何为流中所有匹配的字符串长度创建列表!我尝试了以下方式,这给了我重复键的例外,这很明显.

private static void changeToMap(List<String> listString)
{
    Map<Integer, String> map=listString.stream().collect(Collectors.toMap(x->x.toString().length(),x->x));
    System.out.println(map);        
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

如何使用Java8流从嵌套对象组装Map <Key,Value>?

假设我有3辆汽车,每辆汽车有3个发动机,每个发动机有3个零件.如何map of <engine_model, List<parts>>使用Java8流创建一个?

在常规Java中,我会执行以下操作:

Map<String, List<Parts>> map = new HashMap<String, List<Parts>>();
for (Car car: cars){
  for (Engine engine: car.getEngines()){
    if (!map.contains(engine.getModel())){
      map.put(engine.getModel(), new ArrayList<Part>());
    }
    for (Part  part: engine.getParts()){
      map.get(engine.getModel()).add(part);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这map是一个map将引擎的model(type String)映射到与该模型相关的所有部件的列表.不同的车可以有相同的发动机型号.

我试着做以下事情:

carList.stream().flatMap(p -> p.getEngines().stream())
  .collect(Collectors.groupingBy(p -> p.getModel(),
               Collectors.mapping(Engine::getParts, Collectors.toList())))
Run Code Online (Sandbox Code Playgroud)

问题是上面的使用我得到了 Map<String, List<List<Part>>> 我想要的 Map<String, List<Part>>

我想一个等效的问题是:我怎么改变List of Lists,只是List在上面的例子中的情况下?

java dictionary java-8 java-stream collectors

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

使用Java 8 Streams将地图映射转换为列表

我有一张地图:

Map<String, Map<Integer, List<Integer>>>
e.g. Map<Name, Map<Id, List<ReferenceId>>>

Outcome:
List<Id>
List<ReferenceId>
Run Code Online (Sandbox Code Playgroud)

我想将这个地图转换成两个整数列表.一个列表包含内部映射键,另一个列表包含内部映射值(即List<Integer>)

任何人都可以告诉我如何使用流在Java 8中执行此操作?

我试过这种方式但得到了Cast Exception,无法将String转换为Integer.

map.values().stream()
    .map(m -> m.entrySet()
    .stream()
    .map(e -> e.getKey())
    .collect(Collectors.toList()))
    .flatMap(l -> l.stream())
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

将流收集到LinkedList

流式传输时List,如何将输出收集到链表?

我尝试过以下方法:

public static void main(String[] args) {
    List<String> firstList = new ArrayList<>();
    firstList.add("pavan");
    firstList.add("kumar");
    LinkedList<String> filtered= new LinkedList<>();
    filtered = (LinkedList<String>) firstList.stream().filter(t->firstList.contains("p")).collect(Collectors.toList());
    System.out.println(filtered);        
}
Run Code Online (Sandbox Code Playgroud)

但 这是让java.util.ArrayList无法强制转换为java.util.LinkedList.

java java-8 java-stream

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

合并List <T>和List <Optional <T >>

鉴于:

    List<Integer> integers = new ArrayList<>(Arrays.asList(
            10, 12
    ));

    List<Optional<Integer>> optionalIntegers = Arrays.asList(
            Optional.of(5),
            Optional.empty(),
            Optional.of(3),
            Optional.of(2),
            Optional.empty()
    );

    List<Integer> unwrappedOptionals = optionalIntegers.stream()
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.toList());

    integers.addAll(unwrappedOptionals);
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来展开Optionals,或者将它们合并到一起的其他方式List<Integer>?List在做之前将它们收集到新的中感觉非常浪费addAll().

java java-8 java-stream

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

定义lambda表达式时使用泛型类型参数<T>

请考虑以下代码段:

public class JavaApplication4 {

    static <T> List<T> functionConcat(List<T> l1, List<T> l2) {
        return Stream.concat(l1.stream(), l2.stream()).collect(Collectors.toList());
    }

    // functionConcat in lambda form
    static final BinaryOperator<List<? extends Number>> lambdaConcat = (l1, l2)
            -> Stream.concat(l1.stream(), l2.stream()).collect(Collectors.toList());

    public static void main(String[] args) {
        // DOES NOT WORK with lambdaConcat
        final List<Integer> x = new LinkedList<List<Integer>>()
                .stream().reduce(new LinkedList<>(), lambdaConcat);
        final List<Double> y = new LinkedList<List<Double>>()
                .stream().reduce(new LinkedList<>(), lambdaConcat);

        // WORKS with functionConcat
        final List<Integer> x2 = new LinkedList<List<Integer>>()
                .stream().reduce(new LinkedList<>(), JavaApplication4::functionConcat);
        final List<Double> y2 …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

使用lambda过滤流并抛出异常

目前我们使用的基本方法的实现Set<String> clients如下 -

if (clients.isEmpty()) {
    throw new InvalidClientException();
}

for (String client : clients) {
    if (!myMay.containsKey(client)) {
        throw new InvalidClientException(client);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用lambda表达式转换它,如下所示 -

clients.stream().filter(client -> !myMay.containsKey(client) || clients.isEmpty())
            .forEach(InvalidClientException::new);
Run Code Online (Sandbox Code Playgroud)

但这似乎不是以同样的方式工作,参数化构造函数在这里调用错过了吗?

java lambda exception java-stream

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

Java 8 Stream API如何重用自定义方法

我有一个方法,如:

private List<Person> findFilteredPersons(List<Person> persons,
            Predicate<Person> filter) {
        return persons
                .stream()
                .filter(filter)
                .sorted(BY_NAME.thenComparing(BY_AGE))
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

现在我想在几个地方使用这个方法,但在一个地方我不需要过滤列表,我只想对它进行排序.实现这一目标的最佳方法是什么?

java java-8 java-stream

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

我想在Collection with Streams中计算集合中的集合数

假设我有一个SchoolDistrict,有许多Schools,有许多Students有很多Classes.

我想计算给予SchoolDistrict的课程数量.

Java 7的方式是这样的:

Integer classCount = 0;
for (School school : schoolDistrict)
{
    for (Student student : school.getStudents())
    {
        classCount += student.getClasses().size();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道Java 8带来的流应该会使这种事情在眼睛上变得容易一些.

但我无法弄清楚如何去做.

任何接受者?

编辑:有人将此标记为此帖的副本,我不相信这是因为该示例仅深入2级(国家/地区).我的问题涉及一个深入四个层次的问题(SchoolDistricts to Schools to Students to Classes)

java java-8 java-stream

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

使用Java流从集合中查找最小和最大数量

下面是代码片段,正如预期的那样,在编译时失败.

我真正想要做的是使用流找到所有列表中的最小值和最大值.

public class Delete {

   public static void main(String[] args) {

      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 677, 0);
      List<Integer> list1 = Arrays.asList(11, 12, 23, 34, 25, 77);
      List<Integer> list2 = Arrays.asList(12, 21, 30, 14, 25, 67);
      List<Integer> list3 = Arrays.asList(41, 25, 37, 84, 95, 7);

      List<List<Integer>> largeList = Arrays.asList(list, list1, list2, list3);

      System.out.println(largeList.stream().max(Integer::compare).get());
      System.out.println(largeList.stream().min(Integer::compare).get());
   }

}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

标签 统计

java ×10

java-stream ×10

java-8 ×8

lambda ×2

collectors ×1

dictionary ×1

exception ×1