2016-09-13 25 views
6

Tôi rất mới để scala cố gắng hiểu bằng cách thay đổi java tương đương để scala để tôi có được sự hiểu biết tốt hơn.Làm thế nào để chuyển đổi java 8 bản đồ, bộ lọc và suối để scala?

Làm thế nào để chuyển đổi java 8 bản đồ, bộ lọc và suối để scala?

Tôi có sau mã java 8 mà tôi đang cố gắng để chuyển đổi sang Scala:

public Set<String> getValidUsages(String itemId, long sNo, Date timeOfAccess) {              
    Set<String> itemSet = Sets.newHashSet();                         
    TestWindows testWindows = items.get(itemId).getTestWindows();               

    final boolean isTV = existsEligibleTestWindow(testWindows.getTV(), timeOfAccess);          
    if (isTV) {                                
     itemSet.add(TV);                            
    } else {                                  
     final boolean isCableUseable = existsEligibleTestWindow(testWindows.getCableUse(), timeOfAccess);       
     final boolean isWifi = existsEligibleTestWindow(testWindows.getWifi(), timeOfAccess);        
     if (isCableUseable || isWifi) {                          
      itemSet.add(MOVIE);                           
     }                                  
    }                                   

    if (testWindows.getUsageIds() != null) {                       
     itemSet.addAll(testWindows.getUsageIds()                      
       .entrySet()                              
       .stream()                              
       .filter(entry -> existsEligibleTestWindow(entry.getValue(), timeOfAccess))            
       .map(Map.Entry::getKey)                           
       .collect(Collectors.toSet()));                         
    }                                   

    return itemSet;                                
}                                    

private boolean existsEligibleTestWindow(List<TestWindow> windows, Date timeOfAccess) {           
    if (windows != null) {                              
     return windows.stream()                             
       .filter(w -> withinDateRange(timeOfAccess, w))                     
       .findAny()                              
       .isPresent();                             
    }                                   
    return false;                                
}                                    

private boolean withinDateRange(Date toCheck, TestWindow window) {                  
    return toCheck.after(window.getStartTime()) && toCheck.before(window.getEndTime());               
} 

tôi đã cố gắng:

def withinDateRange(toCheck: Date, window: TestWindow): Boolean = { 
    toCheck.after(window.getStartTime) && toCheck.before(window.getEndTime) 
    } 


    def getValidUsages(itemId: String, sNo: Long, timeOfAccess: Date): Set[String] = { 
    var itemSet = Sets.newHashSet() 
    val testWindows = items.value(itemId).getTestWindows 
    val isTV = existsEligibleTestWindow(testWindows.get(0).getTV, timeOfAccess) 
    if (isTV) { 
     itemSet += TV 
    } else { 
     val isCableUseable = existsEligibleTestWindow(testWindows.get(0).getCableUse, timeOfAccess) 
     val isWifi = existsEligibleTestWindow(testWindows.get(0).getWifi, timeOfAccess) 
     if (isCableUseable || isWifi) { 
     itemSet += MOVIE 
     } 
    } 
    if (testWindows.get(0).getUsageIds != null) { 
     itemSet.addAll(testWindows.get(0).getUsageIds.entrySet().stream() 
     .filter((x) => existsEligibleTestWindow(x._2, timeOfAccess)).map(x => Map.Entry._1) 
     .collect(Collectors.toSet())) 
    } 
    itemSet 
    } 


    def existsEligibleConsumptionWindow(windows: List[ConsumptionWindow], timeOfAccess: Date): Boolean = { 
if (windows != null) { 
    return windows.exists((x) => withinDateRange(timeOfAccess, x)) 
} 
false 
} 

Nhưng nhận được lỗi trong khi làm bộ lọc và suối. Có thể một số điểm để hướng trực tiếp? Bất kỳ tài liệu tham khảo? Tôi nhận được lỗi trên getValidUsages:

compile error “cannot resolve reference project with such signature 
+0

Thông báo lỗi là gì? – Nyavro

+0

Thay vì chuyển đổi cú pháp java thành cú pháp scala, Bạn đã thử kiểm tra javadoc chưa? Bạn không cần luồng không lười biếng. Làm thế nào về 'filter',' map', 'isEmpty' trực tiếp trên' List', 'Set'? – waltersu

+2

Nếu bạn muốn tiếp tục sử dụng các bộ sưu tập java, có thể bạn sẽ cần điều này: https://github.com/scala/scala-java8-compat#using-java-8-streams-with-scala-function-converters –

Trả lời

-1
def getValidUsages(itemId: String, sNo: long, timeOfAcess: Date): Set[String] = { 
    var itemSet: Set[String] = Sets.newHashSet() 
    val testWindows: TestWindows = items.get(itemId).getTestWindows() 
    val isTV: Boolean = existsEligibleTestWindow(testWindows.getTV(), timeOfAccess) 

    isTV match { 
    case true => itemSet.add(TV) 
    case false => { 
     val isCableUseable: Boolean = existsEligibleTestWindow(testWindows.getCableUse(), timeOfAcess) 
     val isWifi: Boolean = existsEligibleTestWindow(testWindows.getWifi(), timeOfAccess) 
     if(isCableUseable || isWifi) { 
     itemSet.add(MOVIE) 
     } 
    } 
    } 

    if(testWindows.getUsageIds() != null) { 
    itemSet.addAll(testWindows.getUsageIds() 
       .stream. 
       .filter(entry => existsEligibleTestWindow(entry._2, timeOfAccess)) 
       .map(filteredData => Map.Entry._1) 
       .collect Collectors.toSet()) 
    } 
    itemSet 
} 

def existsEligibleTestWindow(windows: List[TestWindow], timeOfAcess: Date): Boolean = { 
    windows match { 
    case null => false 
    case _ => windows.stream.filter(data => withinDateRange(timeOfAcess), data).findAny().isPresent 
    } 
} 

Chúc may mắn :)

+0

Điều này vẫn mang lại cho tôi lỗi – Swetha

+0

bạn có thể đăng lỗi không? – HuntsMan

0

này hơi khó trả lời vì tôi quen với một số loại bạn sử dụng. Nhưng nếu tôi đoán có nhiều loại như sau:

trait Window { 
    def getStartTime: LocalDate 
    def getEndTime: LocalDate 
} 
trait TestWindows extends Window { 
    def getTV: List[Window] 
    def getCableUse: List[Window] 
    def getWifi: List[Window] 
    def getUsageIds: Map[String, List[Window]] 
} 

sau đó bạn chỉ có thể làm điều này:

def withinDateRange(toCheck: LocalDate)(window: Window): Boolean = 
    window.getStartTime.isBefore(toCheck) && window.getEndTime.isAfter(toCheck) 

    // Nothing should ever be null in Scala. If it's possible you don't have any ConsumptionWindows you should either 
    // model it as an empty list or an Option[List[ConsumptionWindow]] 
    def existsEligibleTestWindow(windows: List[Window], 
           timeOfAccess: LocalDate): Boolean = 
    windows.exists(withinDateRange(timeOfAccess)) 


    def getValidUsages(testWindows: TestWindows, timeOfAccess: LocalDate): Set[String] = { 
    val isTV = existsEligibleTestWindow(testWindows.getTV, timeOfAccess) 
    val isCableUse = existsEligibleTestWindow(testWindows.getCableUse, timeOfAccess) 
    val isWifi = existsEligibleTestWindow(testWindows.getWifi, timeOfAccess) 
    val tvOrMovie: Option[String] = if (isTV) Some("TV") 
            else if (isCableUse || isWifi) Some("MOVIE") 
            else None 

    val byUsageId = testWindows.getUsageIds.collect { case (key, windows) if existsEligibleTestWindow(windows, timeOfAccess) => key }.toSet 

    tvOrMovie.toSet ++ byUsageId 
    } 

Trong mã ban đầu của bạn có lẽ một số giá trị items, nhưng ở trên tôi chỉ giả bạn làm TestWindows testWindows = items.get(itemId).getTestWindows() bên ngoài chức năng getValidUsages.

Ví dụ của tôi không sử dụng cấu trúc java chút nào và chỉ sử dụng các bộ sưu tập lõi scala. Điểm khác biệt chính khác là tôi sử dụng các cấu trúc dữ liệu không thay đổi được, tôi nghĩ, dễ theo dõi hơn và thường an toàn hơn.

Một số mục cần lưu ý: 1) Kết quả thao tác Option.toSet trong bộ trống khi được gọi khi không có gì. 2) Có một ví dụ về chức năng currying được sử dụng cho phương pháp withinDateRange. 3) Tôi rõ ràng không biết các loại ban đầu của bạn làm gì và phải đoán ở các phần liên quan.

0

Sự cố có vẻ là bạn đang sử dụng các loại Java trong Scala trong khi tùy thuộc vào bản đồ của scala & hoạt động lọc. Điều này có những rắc rối riêng của nó, nhưng nếu bạn chuyển đổi danh sách/bộ sưu tập thành Scala's collections trước (cảnh báo, kiểu Scala là không thay đổi theo mặc định), thì bạn có thể sử dụng các thao tác bản đồ/lọc mà không cần phải gọi phương thức stream() của java.

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