2015-06-09 17 views
20

Tôi đang cố tìm cách sạch và hiệu quả để chuyển đổi Optional<Integer> thành Optional<Long>. Tôi đang làm việc trong Java 7 với ổi.Cách tốt để chuyển đổi Tùy chọn <Integer> thành Tùy chọn <Long>

Vì vậy, ở một nơi trong mã Tôi có một số nguyên tùy chọn tạo

Và trong một khu vực khác tôi cần nó như một lâu tùy ý. Điều đẹp nhất tôi có thể đưa ra là thế này:

Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() { 
     @Override 
     public Long apply(Integer inputInt) { 
      if (inputInt != null) 
       return inputInt.longValue(); 
      else 
       return null; 
     } 
    }); 

Nhưng điều này là cồng kềnh, đặc biệt là nếu bạn xem xét cách dễ dàng là để đúc các loại khi tôi đã sử dụng các loại nguyên thủy.

Có ý tưởng hay nào không?

+13

Sử dụng Java 8 nó chỉ là 'optionalInt.map (i -> (long) i);' –

+3

Trong hàm của bạn, bạn không phải kiểm tra 'null':' Optional.absent(). Transform (...) 'không làm gì cả. –

+8

@PeterLawrey hoặc 'optionalInt.map (Integer :: longValue)' – blgt

Trả lời

20

TL; DR: Trong Java 7, số

Đáng buồn là đây là Java 7 tốt nhất cung cấp hỗ trợ cho các chức năng.

tôi sẽ chỉ nói rằng transform sẽ không bao giờ được gọi với null vì vậy bạn có thể làm:

Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() { 
    @Override 
    public Long apply(Integer inputInt) { 
     return inputInt.longValue(); 
    } 
}); 

Từ the documentation:

Nếu trường hợp là hiện nay, nó được chuyển đổi với trao Function; nếu không, absent() sẽ được trả lại. Nếu hàm trả về null, số NullPointerException bị ném.

Vì vậy không bao giờ trở lạinull từ một Function truyền cho transform.

Nếu bạn sử dụng lại này rất nhiều, sau đó bạn có thể sử dụng mô hình enum singleton:

public enum IntToLong implements Function<Integer, Long> { 

    INSTANCE; 

    @Override 
    public Long apply(Integer input) { 
     return input.longValue(); 
    } 
} 

Sau đó:

optionalInt.transform(IntToLong.INSTANCE); 

Điều này rõ ràng làm giảm mã tại trang web cuộc gọi tại các chi phí của việc có các lớp bổ sung trong cơ sở mã - điều mà tôi sẽ không quá lo lắng.

3

gần với dàn diễn viên:

Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ? 
    optionalInt.get().longValue() : null); 

cơ bản này tránh những phí của cách gọi biến đổi. Gọi isPresent có thể được đơn giản hóa để kiểm tra giá trị cho null một cách trực tiếp.

+6

Tại sao không '= optionalInt.isPresent()? Optional.of (optionalInt.get(). LongValue()): Optional.absent() '. Điều này tránh 'null' - đó là chính xác những gì' Tùy chọn' là nghĩa vụ phải làm. Tôi không chắc chắn "overhead" là từ thích hợp ở đây - có thể là "phức tạp". –

Các vấn đề liên quan