标签: java-8

Java 8Optional.map.orElse 正在执行 orElse 部分

仅当传入的用户对象不存在于数据库中时才尝试保留用户。该服务通过调用用户存储库中的 findByEmail 方法返回一个Optional。就我而言,数据库中已经存在一个确切的用户,并且对象已正确返回。

但是,在我的控制器中,当我执行Optional.map(user).orElse(persistuser)时,会执行orElse部分。

我的理解是,当Optional.map返回Optional并且用户也存在时,那么orElse应该返回用户,而不是执行persistuser操作。

请帮我解决这个问题。

控制器:

@PostMapping(path = "/addUser", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Response> addUser(@RequestBody User user){
        
        user = userService.checkIfUserExsits(user.getEmail())
                          .map(usr -> usr)
                          .orElse(userService.persistUser(user));
        
        return respHelpers.prepareSuccessResponse(user,"Processed");                                       
    }
Run Code Online (Sandbox Code Playgroud)

服务:

public Optional<User> checkIfUserExsits(String email){      
    Optional<User> user = Optional.ofNullable(userRepo.findByEmail(email));     
    return user;
}
Run Code Online (Sandbox Code Playgroud)

存储库:

@Repository
public interface UserRepo extends JpaRepository<User, UUID> {

    public User findByEmail(String email); 

}
Run Code Online (Sandbox Code Playgroud)

java-8 spring-boot option-type

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

Java 8 Collectors.toMap 以 ArrayList 作为值

我想使用 java 8 将给定的二维数组转换为映射。输入 - { { 1, 0 }, { 2, 0 }, { 3, 1 }, { 3, 2 } } 输出的形式应为 Map<Integer,列表>映射=新的HashMap<>(); 输出 - {1=[0], 2=[0], 3=[1, 2]}

下面是我的解决方案

for (int[] prereq : prerequisites) {
            map.computeIfAbsent(prereq[0], k -> new ArrayList<>()).add(prereq[1]);
        }
Run Code Online (Sandbox Code Playgroud)

任何更好的方法,如果 for 循环可以用流代替。

lambda java-8 java-stream

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

使用枚举字段验证 POJO

我正在处理 POJO 的 spring 和 spring 验证。

在 POJO 内部,我有一些字段,其值将映射到特定ENUM类。

正如下面的代码中提到的,我的 cardType 字段为CardType ENUM.

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Max;

@Data
@SuperBuilder(toBuilder = true)
@RequiredArgsConstructor
@EqualsAndHashCode
class SamplePOJO {

    private String cardType;

    @Length(max = 20)
    private String name;

    @Max(10)
    private int number
}

public enum CardType {
VISA, MASTER;
}
Run Code Online (Sandbox Code Playgroud)

对于姓名和号码我可以做@Max and @Length。我如何对属于提到的cardType应用验证enum。同样在将来,我可能List 还需要检查值。所以如果有人可以指导我。

java validation spring java-8

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

从流中的最后一个跳过

有没有办法从处理中排除最后 n 个元素?与skip方法类似但从最后一个跳过。

java java-8 java-stream

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

将日期转换为字符串显示错误 Field DayOfYear 无法打印,因为值 234 超出了最大打印宽度 2

我想将日期转换为不同格式的字符串,但出现以下错误,

DateTimeException-Field DayOfYear cannot be printed as the value 234 exceeds the maximum print width of 2
Run Code Online (Sandbox Code Playgroud)

下面是不同的格式,

"MMDDYY"
"DD_MM_YY" 
"YYYYMMDD"
"MMDD"
"DD-MM-YY"
Run Code Online (Sandbox Code Playgroud)

下面是我的代码,

LocalDate localDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("DD-MM-YY");
String formattToString = localDate.format(formatter);
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

java datetime java-8

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

使用流 API 将数字列表拆分为两个单独的奇数和偶数列表

我正在学习Java8,想要使用Java8中的流API执行以下操作。

输入: (1,2,3,4,5,6,7,8,9) 列表

输出: 奇数列表 - (1,3,5,7,9) 偶数列表 - (2,4,6,8)

我可以在传统java中的单个for循环中执行此操作,例如

List<Integer> ints = Arrays.asList(3,4,2,5,6,7,4,5);
List<Integer> oddList = new ArrayList<>();
List<Integer> evenList = new ArrayList<>();

for (Integer i : ints) {
    if (i % 2 == 0) {
        evenList.add(i);
    } else {
        oddList.add(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道一种以 Java8 风格执行此操作的方法,如下所示 -

List<Integer> evens = ints.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
List<Integer> odds = ints.stream().filter(i -> i % 2 == 1).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这里的问题是我迭代了两次而不是一次整数。有没有一种方法可以做到这一点而无需在流中迭代两次?

java java-8 java-stream

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

Spring Boot 中 JSON 字段反序列化为小写

我有一个Spring Boot Controller-

@RestController
public class UserController {

   @PostMapping
   @ResponseStatus(CREATED)
   public UserResponse register( @Valid @RequestBody UserRequest userRequest) {
     //return ....
   } 
}
Run Code Online (Sandbox Code Playgroud)

下面是UserRequest.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserRequest {

    private String email;
    //other property
}
Run Code Online (Sandbox Code Playgroud)

我在请求正文中发送以下 json -

 {
   "email" : "TEST@Example.com",
   //some other fields.
 }
Run Code Online (Sandbox Code Playgroud)

有时客户端email以大写或驼峰形式发送,因此userRquest我想将email字段的值更改为小写,就像test@example.com反序列化为UserRequest对象时一样。

有没有什么简单的方法可以做到这一点。我可以介绍我自己的注释annotation吗,比如@ToLowerCase如何创建自己的注释并在UserRequest.

jackson java-8 spring-boot jackson-databind

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

如何在 Java 中解析 ISO 8601 最新版本?

我正在尝试将 ISO 8601 日期解析为 Date 对象,但我不能。

我正在尝试以下操作:

        String date = "2021-05-14T09:26:20";
        
        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
        Date newDate = parser.parse(date);
        System.out.println(format.format(newDate));
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

Exception in thread "main" java.text.ParseException: Unparseable date: "2021-05-14T09:26:20"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at com.pruebas.pruebas.fechas.main(fechas.java:14)
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

java java-8

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

java中如何将普通的for循环转换为并行流

我正在尝试将迭代 ArrayList 的普通 for 循环转换为并行循环。我遇到了parallelStream.forEach() 和parallelStream().collect(Collectors.toList()) 的概念。但不清楚如何转换。下面是普通 for 循环的示例代码:

public List<FinPlan> getFinPlanList() {
List<FinPlan> newList = new ArrayList<>();

// get list of string   
List<String> finPlanIdsList = finPlanSearchRequest.getFinPlanIds();

// iterate list and add element to new list
    for(String planId: finPlanIdsList) {
    
        newList.add(retrieveFinPlan(planId));
    }
    
    return newList;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码,但它给了我错误“newList 应该是最终的”。

    finPlanIdsList.parallelStream().forEach( planId -> {
            newList.add(retrieveFinPlan(planId));
    });
Run Code Online (Sandbox Code Playgroud)

那么,主要问题是如何将上面的普通循环转换为parallelStream.forEach()和parallelStream().collect()?

java parallel-processing java-8 parallel.foreach

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

Java:获取类成员列表,用于多级嵌套列表中的列表

在Java中,如何使用列表中的列表来映射和获取类成员列表。

public class CustomerSales {
    public List<Product> productList;
    ....
}

public class Product {
    public List<ProductSubItem> productSubItemList
    ....
}

public class ProductSubItem {
    public String itemName;
Run Code Online (Sandbox Code Playgroud)

试图:

然而,这并没有得到itemName。我正在寻找一种干净有效的方法,理想情况下可能想尝试 4-5 级深度,但为了简单起见,问题只有 3 级,等等

List<String> itemNameList = customerSales.productList.stream()
    .map(p -> p.productSubItemList())
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我正在使用 Java 8。

尝试使用此资源:仍然不走运,如何使用 Java 8 Stream 从某些类属性中获取列表?

java list java-8 java-stream

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