我正在使用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>>,有人可以建议请问这个方法应该如何完成?谢谢!
我有一张地图Map<Id,Map<Obj1,Obj2>> existingMap and List<Obj1> list; 我需要添加列表值以映射为键和新Map作为值.
我尝试过这样的事情:
existingMap.putAll(list.stream().map(x->x.getId()).collect(
Collectors.toMap(x, x -> Map<Obj1,Obj2>::new);
Run Code Online (Sandbox Code Playgroud)
我该怎么写呢?如何使用参数化构造函数来防止默认?
假设我有3个下载,框架为可完成的期货:
CompletableFuture<Doc> dl1 = CompletableFuture.supplyAsync(() -> download("file1"));
CompletableFuture<Doc> dl2 = CompletableFuture.supplyAsync(() -> download("file2"));
CompletableFuture<Doc> dl3 = CompletableFuture.supplyAsync(() -> download("file3"));
Run Code Online (Sandbox Code Playgroud)
然后所有这些都需要以相同的方式处理
CompletableFuture<String> s1 = dl1.thenApply(Doc::getFilename);
CompletableFuture<String> s2 = dl2.thenApply(Doc::getFilename);
CompletableFuture<String> s3 = dl3.thenApply(Doc::getFilename);
Run Code Online (Sandbox Code Playgroud)
您可以想象要应用的多个功能,所有功能都是并行的.
根据DRY原则,这个例子似乎不合适.所以我正在寻找一种解决方案来定义仅执行3次并行执行的工作流程.
如何实现这一目标?
我尝试过allOf,但这有两个问题:1)它开始阻塞,2)返回类型只能run填充而不是处理它.
java concurrency java.util.concurrent java-8 completable-future
我可以使用IntelliJ IDEA重构用等效表达式替换lambda表达式.谢谢.
public class StateOwner {
public void addStateListener(StateChangeListener listener) { ... }
}
..
StateOwner stateOwner = new StateOwner();
stateOwner.addStateListener(
(oldState, newState) -> System.out.println("State changed")
);
Run Code Online (Sandbox Code Playgroud)
我可以使用IntelliJ IDEA替换lambda表达式部分
stateOwner.addStateListener(new StateChangeListener() {
public void onStateChange(State oldState, State newState) {
System.out.println("State changed")
}
});
Run Code Online (Sandbox Code Playgroud) 我想使用Java 8从字符串转换为日期。
我可以轻松地使用SimpleDateFormat和进行yyyy-MM-dd格式转换
String startDate2="2017-03-24";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(new java.sql.Date(sdf1.parse(startDate2).getTime()));
Run Code Online (Sandbox Code Playgroud)
输出: 2017-03-24
String startDate2="2017-03-24";
SimpleDateFormat sdf1 = new SimpleDateFormat("uuuu-MM-dd");
System.out.println(new java.sql.Date(sdf1.parse(startDate2).getTime()));
Run Code Online (Sandbox Code Playgroud)
但是当我用'uuuu-MM-dd'代替'yyyy-MM-dd'
输出:(
1970-03-24错误)
现在在Java 8中:
String startDate1="2017-03-23";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd");
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何获取与上述正确输出相同的sql date类型的日期。
我正在练习Java 8.我不明白为什么这个方法总是返回0,或者更好的身份值:
public static Integer getMinAge(List<Person> peopleList) {
return peopleList.stream().mapToInt(Person::getAge).reduce(0, Integer::min);
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,Integer :: max方法返回正确的值.我在这做错了什么?
我想同步一段代码,但不想简单地锁定实现类(this).
有问题的代码块是一个接收id的方法的一部分.
如果传入方法的id包含在类的列表中,我想禁止新线程进入块...如果它不在列表中,则实体可以自由操作,因此线程将是允许进入街区......
有没有直接的方法来做到这一点?
这可能很简单.但我正在努力寻求最佳解决方案.有人可以用Java或Java 8帮助我吗?
问题
我有一个String URL /api/data/stiffers:stiffer-state/stiffer=monkey-king 0/1?fields=(status;statistics;speed).我想用字符'/'拆分它,但stiffer=monkey-king 0/1不应拆分.因为它还有一个字符'/'.
有人可以帮我代码吗?
更清楚的是,输出应该是
api
数据
严重:僵硬状态
僵硬= monkey-king 0/1?fields =(状态;统计;速度)
我想使用流从类型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 ×10
java-8 ×10
java-stream ×3
lambda ×2
collections ×1
concurrency ×1
dictionary ×1
hashmap ×1