Loading...
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

JAVA ADVANCED,MISUNDERSTANDING STREAM API WITH OBJECTS

Здравейте,

Може ли някой, ако може да погледне, кода и да каже може ли да се направи със StreamApi и как ще изглежда.  // @MARTINBG 

Това е масив от обекти, в метода се търси броя по - големи елементи от подадения.

Благодаря предварително!

 public int getCountGreater(E element) {
        int counter = 0;
        for (int i = 0; i < this.size; i++) {
            if (this.getAt(i).compareTo(element) > 0) {
                counter++;
            }
        }
        return counter;
    }

 

1
Java Advanced
MartinBG avatar MartinBG 4803 Точки
Best Answer

Може да се използва комбинация от filter и count (трябва да кастнем резултатата от long към int).

Варианти без директен достъп до масива (използваме getAt метода за извличане на елементите):

        public int getCountGreater(E element) {
            return (int) IntStream.range(0, this.size)
                    .filter(index -> getAt(index).compareTo(element) > 0)
                    .count();
        }

Или така: 

        public int getCountGreater(E element) {
            return (int) IntStream.range(0, this.size)
                    .mapToObj(this::getAt)
                    .filter(current -> current.compareTo(element) > 0)
                    .count();
        }

Ако масива е достъпен, например от поле с име data:

        public int getCountGreater(E element) {
            return (int) Arrays.stream(this.data)
                    .filter(current -> current.compareTo(element) > 0)
                    .count();
        }

 

1
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

Благодаря !!! 

1
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

Още един глупав въпрос, извинявам се, че досаждам. Как да намерим макс и мин елементите? Трябва ли да кастна в stream -a към типа <Е>, опитах Stream<E> и каквото намерих в нета, но не го разбирам и не ми се получава. Ако взема от метода, където гетвам по индекс, той е кастнат към generic, но ми връща обект и пак не ми позволява да дам макс с Comperator, a с ламбда не достъпва друго освен classname. 

Иначе с обикновения for ... :

public E getMax() {
    E max = this.getAt(0);
    for (int i = 0; i < this.size; i++) {
        if (this.getAt(i).compareTo(max) > 0) {
            max = this.getAt(i);
        }
    }
    return max;
}

 

1
14/06/2020 20:41:27
MartinBG avatar MartinBG 4803 Точки

@AnnaIvanova11

За да използваме compareTo метода, Е трябва да екстендва Comparable<E>:

public class MyDataClass <E extends Comparable<E>> { 
    // fields, Constructor(s), other methods 

    public E getMax() {
        E max = this.getAt(0);
        for (int i = 0; i < this.size; i++) {
            if (this.getAt(i).compareTo(max) > 0) {
                max = this.getAt(i);
            }
        }
        return max;
    }
}

Ето варианти със стрийм за getMin/getMax:

public E getMax() {
    return Arrays.stream(data)
            .max(E::compareTo)
            .orElseThrow();
}

public E getMin() {
    return Arrays.stream(data)
            .min(E::compareTo)
            .orElseThrow();
}

 

 

Ето и цялото демо:

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        Integer[] data = {0, 1, 2, 3, 4, 100, -100};
        MyDataClass<Integer> myDataClass = new MyDataClass<>(data);

        System.out.println(myDataClass.getMax()); // 100
        System.out.println(myDataClass.getMin()); // -100

        System.out.println("Exception expected:");
        System.out.println(new MyDataClass<>(new Integer[0]).getMax()); // throws NoSuchElementException
    }

    private static class MyDataClass<E extends Comparable<E>> {
        private E[] data;
        private int size;

        public MyDataClass(E[] data) {
            this.data = data;
            this.size = data.length;
        }

        public E getAt(int index) {
            return data[index];
        }

        public E getMax() {
            return Arrays.stream(data)
                    .max(E::compareTo)
                    .orElseThrow();
        }

        public E getMin() {
            return Arrays.stream(data)
                    .min(E::compareTo)
                    .orElseThrow();
        }
    }
}

 

1
15/06/2020 05:45:05
AntonPortenov avatar AntonPortenov 102 Точки
Пробвай нещо такова


public E getMax() {
   return this.stream().reduce(reducer).get();
}


private BinaryOperator<E> reducer = (first,second) -> {
      if(first.compareTo(second) >= 0) return first;

      else return second;

};

 

0
14/06/2020 22:08:54
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

@MartinBG Отново благодаря много!!!

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.