2017-06-03 57 views
1

讓我們看看我的程序。這與汽車模型有一些虛構的.txt文件。作爲函數參數的Java布爾方程

public class Car { 
    private String model; 

    public String getModel() { 
     return this.model; 
    } 
} 

public class Main { 
    public static void Main(String[] args) { 
     ArrayList<Car> cars = loadCars(path); //imaginary func and file 
     String someModel = generateSomeModel(); //imaginart func 

     for (Car c : cars) 
      if (c.getModel.equals(someModel)) 
       System.out.println("Hit!"); 

     for (Car c : cars) 
      if (!c.getModel.equals(someModel)) 
       System.out.println("Hit!"); 

    } 
} 

讓我們假設,我要通過我的汽車列出100次,他們在比較,如果爲每一段不同的屬性聲明,這意味着我將不得不寫100個不同的for循環,這將是90%相同。有沒有辦法編寫一個函數作爲參數布爾方程?像這樣的東西。

public static void printCars(Boolean equation) { 
    for (Car c : cars) 
     if (Boolean equation) 
      System.out.println("Hit!"); 
} 
+1

我現在認識到你沒有把你的問題標記爲java-8。你在使用java 8還是使用以前的版本? –

回答

2

您可以使用謂詞接口傳遞函數(或lambda)作爲參數傳遞給你的函數:

https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

使用謂詞時,可以重寫你的函數的方式如下:

public static void printCars(Predicate<Car> filter) { 
    for (Car c : cars) 
     if (filter.test(car)) 
      System.out.println("Hit!"); 
} 

然後按以下方式傳遞所需功能:

printCars(c -> c.getModel().equals("bmw"));

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/評論/低質量帖/ 16318885) –

+0

@AryaMcCarthy同意,補充缺少的一部分。謝謝! –

+0

應該是'filter.test(car)'。 – shmosel

0

如果你需要你的汽車比較多的屬性,你只需要重寫等於爲汽車方法。

@Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj instanceof Car) { 
      Car anotherCar = (Car)obj; 
      return this.model.equals(anotherCar.model) && 
        this.color.equals(anotherCar.color) && 
        this.year == anotherCar.year; 
     } 
     return false; 
    } 

這樣你會比較所有必要的屬性在一個步驟:

List<Car> cars = //cars list 
Car someCar = //bmw car 
for (Car c : cars) { 
    if (c.equals(someCar)) { 
     System.out.println("Hit!"); 
    } else { 
     System.out.println("Another Hit!"); 
    } 
} 
2

如果你是在Java的8,您可以使用Stream API與Predicate

cars.stream() 
    .filter(c -> c.getModel().equals(someModel)) 
    .forEach(c -> System.out.println("Hit!")); 

Stream.filter方法的參數是Predicate,表示爲lambda表達式,在此例中爲car -> someModel.equals(car.getModel())

您可以更改lambda表達式來匹配你的第二個例子:

cars.stream() 
    .filter(c -> !c.getModel().equals(someModel)) 
    .forEach(c -> System.out.println("Hit!")); 

的方式來抽象的這一個方法是通過列表,謂詞,如果你想,一個​​,將採取對匹配元素進行一些操作。下面是一些代碼,你可以作爲一個起點使用:

public static void handleCars(
     List<Car> cars, 
     Predicate<Car> condition, 
     Consumer<Car> action) { 

    cars.stream().filter(condition).forEach(action); 
} 

您可以讀取該行的代碼:流汽車的匹配列表給定的條件,過濾器只有汽車,爲每一個其中,採取給定動作

而且你可以按照以下方式調用該方法handleCars

handleCars(
    cars, 
    c -> c.getModel().equals(someModel), 
    c -> System.out.println("Car with model " + someModel + " hit!")); 

或者:

handleCars(
    cars, 
    c -> c.getBrand().toLowerCase().contains("mercedes"), // assume brand is String 
    c -> System.out.println("Mercedes model found: " + c.getModel())); 

正如你看到的,謂詞和消費者可以根據您的需要爲複雜。