标签: java-8

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列表到现有地图

我有一张地图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)

我该怎么写呢?如何使用参数化构造函数来防止默认?

java lambda dictionary hashmap java-8

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

CompletableFuture:如何将函数应用于多个CompletableFutures?

假设我有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

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

将Intellida表达式替换为IntelliJ IDEA中的等效代码

我可以使用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 lambda intellij-idea java-8

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

使用Java 8和格式-&gt;'uuuu-MM-dd'将String转换为日期

我想使用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 java-8

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

Java 8计算最小值

我正在练习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方法返回正确的值.我在这做错了什么?

java java-8

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

基于Map的内容进行同步

我想同步一段代码,但不想简单地锁定实现类(this).

有问题的代码块是一个接收id的方法的一部分.

如果传入方法的id包含在类的列表中,我想禁止新线程进入块...如果它不在列表中,则实体可以自由操作,因此线程将是允许进入街区......

有没有直接的方法来做到这一点?

java multithreading java-8

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

Java-如何拆分和忽略具有此特殊字符的String

这可能很简单.但我正在努力寻求最佳解决方案.有人可以用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 =(状态;统计;速度)

java java-8

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

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
查看次数