Софтуерно Инженерство
Loading...
Vincent avatar Vincent 11 Точки

Stream в Java Fundamentals

Здравейте,

В момента се подготвям за изпита Programming Fundametals - Extened. Реших да се явя с Java на него и в момента имам малко проблеми с поготовката. Стхава въпрос за .stram()-овете и техния синтаксис. Питането ми е дали във Java Fundamentals модула, някаде се обясняват за за мога да погледна обяснението.

Поздрави

Тагове:
0
Java Fundamentals
Vincent avatar Vincent 11 Точки

Колеги благодаря за помоща! Гледам първото клипче от martinml и постепенно почвам да ги схващам нещата. По късно ще погледна и твоя линк.

Към момента имам проблем с String.join-ването и при принтирането на някакавъ масив искам да сложа разтояние/символ между отделните лементи.

Също искам да попитам дали тези неща са еквивалентни(едното разбира се е масив, а другото лист):

 

int[] dsada = Arrays.stream(reader.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

List<Integer> ht = Arrays.stream(reader.readLine().split(" ")).map(Integer::valueOf).collect(Collectors.toList());

0
27/11/2017 13:40:18
MartinBG avatar MartinBG 1215 Точки

Ето два начина за принтиране елементите на колекции, разделени със сепаратор:

System.out.println(myCollection.stream().collect(Collectors.joining(", ")));
System.out.println(String.join(", ", myCollection));

0
Vincent avatar Vincent 11 Точки

Да, аз ползвам първия. Когато го използвам с String работи.

List <String> name = Arrays.asList("Ivan","Filip","Pesho");
System.out.println(String.join("-",name));

Когато го ползвам с Integer, не. Знам че трябва да му дам MapToObj, но нещо не сработва.

List<Integer> num = Arrays.asList(1,2,3);
System.out.println(String.join("=",num));

Какъв е правилния синтаксис в този случай?

 

0
MartinBG avatar MartinBG 1215 Точки

joining работи със стрингове, т.е. трябва да мапнеш елементите към String:

List<Integer> num = Arrays.asList(1,2,3);
System.out.println(num.stream().map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(String.join("=", num.stream().map(Object::toString).collect(Collectors.toList())));

Output:

1, 2, 3
1=2=3

Или така:

        System.out.println(num);
        System.out.println(num.toString().replaceAll("[\\[\\]]", ""));
        System.out.println(num.toString().replaceAll("[\\[\\]]", "").replaceAll(", ", "="));

Output:

[1, 2, 3]
1, 2, 3
1=2=3

0
27/11/2017 16:40:26
Vincent avatar Vincent 11 Точки

Получи се благодаря! А дали може да ми кажеш каква е разликата в следните два map-а

map(Integer::valueOf)

и

mapToInt(Integer::valueOf)
0
MartinBG avatar MartinBG 1215 Точки

mapToInt връща IntStream, който е стрийм от int (примитивен тип) и има няколко допълнителни метода (напр. sum) за работа с int. На теория би следвало да е една идея по-бърз от stream от Integer, защото не се налага boxing/unboxing при някои операции.

0
27/11/2017 21:55:45
Vincent avatar Vincent 11 Точки

Здравей дали ще може да ми помогнеш още малко с stream-овете. решавам езна задача и има изискване за памет. Сменям от Intiger на Byte и кода се чупи. какт трябва да процедирам?

List<Byte>beehives=Arrays.stream(scanner.nextLine().split(" ")).map(Byte::valueOf).collect(Collectors.toList());
beehives=beehives.stream().map(e->e-1).collect(Collectors.toList());

Също, ако може да ми кажеш има ли начин да вкарам if в Stream-a и да филтрирам по него.

0
25/12/2017 14:43:05
MartinBG avatar MartinBG 1215 Точки

Въпросите ти са твърде общи, за да мога да ти дам конкретен отговор.

Кастването от по-голям към по-малък тип (напр. Integer/int -> Byte/byte) е опасна операция, защото може да доведе до невалиден резултат в повечето случаи. Валидните стойности за byte са от -128 до 127 (8 бита), докато int е 32 битов. Тук можеш да прочетеш повече за размера на примитивните типове в Java.

Стриймовете в Java имат .filter(условие) метод.

Напр. ако искаме да филтрираме и използваме само числата между -100 и 100, може да използваме следният филтър:

        List<Integer> lst = Arrays.asList(1, 2, 3, 100, 101, -100, -1000);
        lst.stream().filter(x -> x <= 100 && x >= -100).forEach(System.out::println);

 

0