Java, как использовать computeIfAbsent computeIfPresent для выполнения этой цели? - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь создать Фабрику со следующей функцией:

  • она всегда должна возвращать объект Filter.

  • Любой изhashmap =, если строковые буквы (ключ) уже существуют в hashmap, он должен просто взять свое значение (объект) из hashmap и вернуть его.

  • или новый, если в хэш-карте нет этого ключа, затем создайте новый объект и верните его.

Программа должна работать в следующем порядке в соответствии с пользовательским вводом:

 //user first input. 
 String letters="aaa"; // creat new object. 
 //user second input. 
 String letters="fff"; // creat new object. 

 String letters="aaa"; //dont make a new object and return the object and return the object of the first input.

Для этого я подумал о следующем:

  • первое, что у меня на уме было использовать хеш-карты.
  • , назначив String letters в качестве ключа и объект Filter в качестве значения.
  • далее я хотел сравнитьесли ключ не был введен ранее, то создайте новый объект, если ключ уже существует, затем верните его объект.

Вот что я написал на данный момент:

(FactoryClass)

 //if i let this i will getjava.lang.NullPointerException
 //private static Filter filter = null;
 public static Filter getFilter(String letters){

        Filter filter=new Filter(letters);

        HashMap <String, Object> hmap = new HashMap< String , Object> ();

        hmap.put(letters,filter);

        //for the first run is true because the map has yet only one pair of <k,v>
        if (hmap.containsKey(letters))
        {
            System.out.println("return the obj where there is a key match");//i will remove this later cz the user doesnt care about it. 
            //so i will return the filter object that has been created here "hmap.put(letters,filter);" by returning the value that matches the key.
            return (Filter) hmap.get(letters);  

        } else {//if the user didn't enter the same key then a new object shall be created!.

            System.out.println("new object has been generated");//i will remove this late cz the user doent care about it.
            //if the entered letters(key) isnt found in the map then put it in the map and creat new object. 
            hmap.put(letters, filter);

            return filter;
        }
    }

Конструктор в другом классе защищен, и фабрика будет получать строковые буквы для каждого пользовательского ввода из метода main.Любая помощь будет принята, но, пожалуйста, продемонстрируйте свои предложения в коде Java.

хорошо, это, видимо, не решает проблему, но как решить проблему?

, поэтому я искал в Интернете и нашел computeIfAbsent, но я не знаю точно, как его использовать.на Java Orcale Doc это то, что написано иhmap.computeIfAbsent(letters, k -> new Filter (k) );

теперь я не понимаю, что означает здесь «k», и что означает «->», я пытался использовать его, как указано выше, но у меня возникли некоторые ошибки:

  • k не может быть преобразовано в переменную
  • Синтаксическая ошибка на токене "-", "-" ожидаемый
  • l не может быть преобразовано в переменную

    1. Первый вопрос, как должен выглядеть код при использовании computeIfAbsent?
    2. Есть ли где-нибудь, где я могу получить то, что хочу, без использования этих computeIfAbsent и coputeIfPresent?

У меня уже есть следующее в фильтре классов

public class Filter {
private final String letters;

    protected Filter(String letters) {
        this.letters = letters;
    }
public static void main(String[] args) {
while(true){
    //Scanner to allow user to give input!.
    Scanner in =new Scanner(System.in);

    System.out.println("please enter the filter stirng!");

    String filter= in.next();
 }
}


 public static Filter getFilter(String letters) {
          Filter obj = hmap.get(letters);
          if (obj == null) {
             obj = new Filter(letters);
             hmap.put(letters, obj);
          }
          return obj;
       }

1 Ответ

0 голосов
/ 16 июня 2019

Попробуйте это


    public static void main(String[] args) {
          Filter f = FilterFactory.getFilter("aaa"); // call from user1
          Filter g = FilterFactory.getFilter("bbb"); // call from user2
          Filter h = FilterFactory.getFilter("aaa"); // call from user3
          System.out.println(f == h); // same filter
    }

    class FilterFactory {
       private static Map<String, Filter> map = new HashMap<>();

       private FilterFactory() {
       }

       public static Filter getFilter(String letters) {
          return map.computeIfAbsent(letters, Filter::new);
       }

 // Pre-java 8 version
       public static Filter getFilter2(String letters) {
          Filter f = map.get(letters);
          if (f == null) {
             f = new Filter(letters);
             map.put(letters, f);
          }
          return f;
       }

    class Filter {
       String f;

       public Filter(String f) {
          this.f = f;
       }

       public String toString() {
          return f;
       }
    }

Во всех случаях ключом к hashMap является аргумент конструктора фильтра.

  • Для ссылок на метод это подразумевается.
  • Для лямбд это локальная переменная (k в приведенных выше примерах).

Примечание: для работы требуется Java 8+.

...