以下代码是一个伪代码,表示我想要实现的目标:
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 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) 我有一个代码片段,如:
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>>,有人可以建议请问这个方法应该如何完成?谢谢!
我想使用流从类型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 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) 我有一组整数,我想计算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的功能 - 所以我该怎么做才能使它工作?
我有一个简单的类,有三个值:
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"}?
我有一个列表地图,并希望收集所有的值,然后在收集的列表上流,所以给出: -
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 8通过谓词查找第一个元素
有没有一种简单的方法来获取该元素的索引?
编辑:链接的问题确实提供了答案,但是由于其表达方式,我在搜索时找不到它。因此,我宁愿保留这个问题。
我正在寻找一个问题的答案:方法.toArray(IntFunction generator)如何知道新数组的大小.
实际上我知道如何使用这个方法来创建包含所有stream元素的新数组(例如String[]::new, Size -> new String[Size]),但在原始的java代码中我们可以看到IntFunction<A[]>生成器将给定的函数应用于int参数.我的问题是这个函数如何获取流的元素数量.
我已经阅读了这个课程的源代码3个小时,但我找不到答案.
非常感谢!