标签: java-stream

使用收集器根据Java中的类将steam拆分为列表

以下代码是一个伪代码,表示我想要实现的目标:

Map<Class<?>, List<?>> map = Stream.of(1, "2").collect(Collectors.groupingBy(Object::getClass));
List<Integer> ints = map.get(Integer.class);
List<String> strings = map.get(String.class);
Run Code Online (Sandbox Code Playgroud)

以上是简化的代码.我想要的是我有一个输入列表,我想根据对象的类将它拆分成多个列表.

但是上面的代码没有编译,我想知道你怎么能解决它?

java java-stream collectors

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

Java 8显示了此错误.在封闭范围内定义的局部变量itemList必须是最终的或有效的最终

我正在使用java 8编写代码,但我迭代a List然后RestaurantOrderBook使用类别类型查找.把它List放进去Map.它显示了这个错误:

在封闭范围内定义的局部变量itemList必须是最终的或有效的最终

Query query = new Query();
String categ = category;
query.addCriteria(Criteria.where("restaurantId").is(restaurantId));

List<RestaurantOrderBook> itemList = new ArrayList<RestaurantOrderBook>();
itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
System.out.println("size : " + itemList.size());
Map<String , List<RestaurantOrderBook>> map = new HashMap<String , List<RestaurantOrderBook>>();
        Arrays.asList("TakeAway", "Dining").forEach(e ->{

//Following line throws error:              
List<RestaurantOrderBook> list  = itemList.stream().filter(a -> !a.getOrderType().isEmpty() && a.getOrderType().equals(e)).collect(Collectors.toList());
                map.put(e, list);
        });
Run Code Online (Sandbox Code Playgroud)

我有另一种情况:

@Override
    public EventReportRewardsPoints eventReportRewardsPoints(String organizerId) {
        try{
            List<Event> listOfEvents = eventRepo.findByOrganizerId(organizerId);
            EventReportRewardsPoints eventTransReport = new …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

使用Java 8流重构循环和条件

我有一个代码片段,如:

List<Ticket> lowestPriceTickets(List<Info> infos, Ticket lowestPriceTicket) {
    List<Ticket> allLowestPriceTickets = new ArrayList<>();

    for (Info info : infos)
    {
        if (info.getTicketTypeList() != null)
        {
            for (Ticket ticket : info.getTicketTypeList())
            {
                if (lowestPriceTicket.getCode().order() == ticket.getCode().order())
                {
                    allLowestPriceTickets.add(ticket);
                }
            }
        }
    }
    return allLowestPriceTickets;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Java 8流重构它,但后来坚持了下来

infos.stream()
                .filter(info -> info.getTicketTypeList() != null)
                .map(Info::getTicketTypeList)
Run Code Online (Sandbox Code Playgroud)

因为我想过滤每个Ticket但是看看Stream<List<Ticket>>,有人可以建议请问这个方法应该如何完成?谢谢!

java java-8 java-stream

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

java 8 stream从类型A的集合创建类型B的集合

我想使用流从类型B创建类型A的集合.

假设我有两个班级

Class Employee{
   String firstName;
   String lastName;
   int age;
   String id;
   String email;
   double salary;
}

Class Person {
  String firstName;
  String lastName;
  String email;
}
Run Code Online (Sandbox Code Playgroud)

要从Employee的集合创建Person的集合,我写下面的代码

public static List<Person> createPersonsFromEmployees(List<Employee> employees) {

        List<Person> persons = new ArrayList<>();

        employees.stream().filter(Object :: nonNull)
                  .forEach(e -> {
                       persons.add(new Person(e.getFirstName(),
                                           e.getLastName(), 
                                           e.getEmail());
                   };)


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

目前,这段代码有效.但我想知道,想知道是否有更好的方法来创建的集合Person,从Employee没有使用forEach.

java collections java-8 java-stream

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

如何将此代码转换为JAVA 8 Stream API?

我想使用Java 8将此while循环转换为等效代码Stream,但我不知道如何从中流式传输List 和删除元素.

private List<String> nameList = new ArrayList<>();

while (nameList.size() > 0) {
    String nameListFirstEntry = nameList.get(0);
    nameList.remove(0);
    setNameCombinations(nameListFirstEntry);
}
Run Code Online (Sandbox Code Playgroud)

java list java-8 java-stream

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

在Java 8中使用当前流方法中的Stream方法

我有一组整数,我想计算max()我的流包含的整数数量.该max()方法来自Stream API.

我想要这样的事情

int count = Arrays.stream(myIntArray)
            .filter(i -> i == max())
            .count();
System.out.printf("Count: %d", count);
Run Code Online (Sandbox Code Playgroud)

我无法max()从我的forEach()方法中调用该方法,因为这不是Streams的功能 - 所以我该怎么做才能使它工作?

java java-8 java-stream

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

按键通过流排序的集合

我有一个简单的类,有三个值:

class Book{
   private String title;
   private String author;
   private double price;
}
Run Code Online (Sandbox Code Playgroud)

title是独一无二的(永远).有一个选定的标题列表(as List<String>)和每个Book系统的列表.我希望Book从标题列表中获取所有密钥.我的代码是:

List<Book> allBooks = getAllBooks();
List<String> selectedTitles = getSelectedTitles();
List<Book> selectedBooks = allBooks.stream().
   filter(x -> selectedTitles.contains(x.getTitle())).
   collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

它的工作原理,但是选择的allBook书籍是通过insted 来订购的selectedTitles.例如:

allBooks(only title) = {"A","B","C","D"}
selectedTitles = {"B","A","D"}
selectedBooks(only title) = {"A","B","D"}
Run Code Online (Sandbox Code Playgroud)

怎么可能(通过stream()订购selectedTitles?)(这个例子应该是{"B","D","A"}?

java java-8 java-stream

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

Java 8流 - 收集和流式传输列表

我有一个列表地图,并希望收集所有的值,然后在收集的列表上流,所以给出: -

Map<LocalDateTime, List<PublicationSession>> effectiveDatePublicationMap;
Run Code Online (Sandbox Code Playgroud)

下面的工作/显示我想用迭代做什么,但我想在流中完成所有操作,而不是使用迭代创建一个中间列表: -

List< PublicationSession> publicationsToFilter = new ArrayList<>();
for (List< PublicationSession> sessions : effectiveDatePublicationMap.values()) {
    publicationsToFilter.addAll(sessions);
}

Collection< PublicationSession > wantedPublications = publicationsToFilter.stream()
            .filter(pub -> PublicationStatus.valueOf(pub.getPublishStatus()) == PublicationStatus.COMPLETE)
            .sorted(Comparator.comparing(PublicationSession::getCreateTime))
            .collect(toMap(p -> p.getPublicationSession().getEffDateTime(), UnaryOperator.identity(), PICK_LATEST))
            .values();
Run Code Online (Sandbox Code Playgroud)

因此,我想将列表的映射全部流式传输到一个列表中,然后在一个流中处理该子列表,而不是必须在两个语句中执行上述操作(即通过迭代构建列表,然后执行流式处理以过滤/排序和搜集.

到目前为止我没有这样做,当我尝试流式/收集地图时,我得到编译问题.任何人都可以一步显示如何执行上述操作,而无需进行迭代然后流式传输?

java collections java-stream

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

获取与谓词匹配的元素的索引

我知道如何通过谓词查找列表的第一个元素: Java 8通过谓词查找第一个元素

有没有一种简单的方法来获取该元素的索引?

编辑:链接的问题确实提供了答案,但是由于其表达方式,我在搜索时找不到它。因此,我宁愿保留这个问题。

java collections java-stream

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

方法.toArray(IntFunction <A []>生成器)如何知道新数组的大小

我正在寻找一个问题的答案:方法.toArray(IntFunction generator)如何知道新数组的大小.

实际上我知道如何使用这个方法来创建包含所有stream元素的新数组(例如String[]::new, Size -> new String[Size]),但在原始的java代码中我们可以看到IntFunction<A[]>生成器将给定的函数应用于int参数.我的问题是这个函数如何获取流的元素数量.

我已经阅读了这个课程的源代码3个小时,但我找不到答案.

非常感谢!

java arrays java-8 java-stream

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

标签 统计

java ×10

java-stream ×10

java-8 ×7

collections ×3

arrays ×1

collectors ×1

list ×1