HLFX.Ru Forum
Показать все 8 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Вопрос по Java 8 (https://hlfx.ru/forum/showthread.php?threadid=5665)


Отправлено Chyvachok 04-06-2021 в 11:07:

Вопрос по Java 8

Интересно тут есть знатоки джавы? Есть несколько заданий по лямбда выражениям и Stream Api, вот только в эти лямбды я очень туго вьезжаю, хотел бы спросить пару советов как и с ними работать. Смысл задания в том чтобы в return return List.stream() и далее функциями этого стрима реализовать задание, при помощи filter, map, flatmap и так далее, но есть пара заданий что я никак не могу придумать, хотелось спросить совета.

C++ Source Code:
1
Write functional programming lambda expressions using Java 8 streams. Each task must be solved with one lambda expressions. Put lambda expressions in the return statement1.
2
 
3
Task 8. - вприципе не понимаю что от меня хотят, я в математике не силен и не знаю что такое ordinal number inclusive.
4
 
5
You are given a positive integer K and integer D and a sequence of integers integerList. Compute a union of two subsets of integers: the first subset is all values of integerList greater than D, the second subset is an integer list of values starting with an element with ordinal number K inclusive (the numbering of elements in the integer list starting from 0). Sort the resulting sequence in descending order. For example:
6
input: D = 3, K = 4, integerList{-10, 3, -3, 4, 55, 6}
7
output: {55, 6, 4}
8
 
9
Task 9. - хотелось бы совета.
10
 
11
A sequence of non-empty strings stringList is given, containing only uppercase letters of the Latin alphabet. For all strings starting with the same letter, determine their total length and obtain a sequence of strings of the form "S-C", where S is the total length of all strings from stringList that begin with the character C. Order the resulting sequence in descending order of the numerical values of the sums, and for equal values of the sums, in ascending order of the C character codes. For example:
12
input: {"ABC", "A", "BCD", "D"}
13
output: {"4-A", "3-B", "1-D"}
14
 
15
В конце есть такой пример выполнения простого задания, по которому я первые делал:
16
An example of solving a task in AutoCode.
17
 
18
Task. Given a sequence of strings stringList. Get a new list of non-empty strings from stringList.
19
 
20
public static List<String> getStringList(List<String> stringList){
21
  return stringList.stream()
22
  .filter(string -> !string.isEmpty())
23
  .collect(Collectors.toList());
24
}


Отправлено Дядя Миша 04-06-2021 в 15:54:

Лямбда это локальная безымянная функция такая. Для удобства.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено AntiPlayer 07-06-2021 в 09:14:

Первая задача на JavaScript решалась бы примерно так, если я верно понял условия (можешь вставить в консоль браузера и проверить). Я думаю подобный синтаксис поймет любой, кто общался с C-подобным синтаксисом.

code:
const d = 3; const k = 4; const integerList = [-10, 3, -3, 4, 55, 6]; const resultOfSubset = integerList.filter( (elem) => elem > d); const resultOfSubsetK = integerList.filter( (_, index) => index >= k); const union = [...new Set(...[resultOfSubsetD, ...resultOfSubsetK])].sort((a,b)=> b-a) console.log(union ); // -> [55, 6, 4]


Тебе нужно получить два массива:
первый это там, где все элементы больше D
второй это все элементы, у которых индекс больше К
Дальше сделать объединение "union" и сортировку.

Но здесь непонятно, зачем столько телодвижений, если объединенный массив получается довольно простым условием "или":

code:
const d = 3; const k = 4; const integerList = [-10, 3, -3, 4, 55, 6]; const union = integerList.filter((number, index) => current > d || index >= k ).sort((a,b)=> b-a) console.log(union ); // -> [55, 6, 4]


PS: ordinal number inclusive -- это индекс элемента в массиве включительно.

__________________
I tell you to enjoy life


Отправлено Дядя Миша 07-06-2021 в 11:50:

обожаю языки с нестрогой типизацией. Возьмём немного кой-чего

C++ Source Code:
console.log(union );

Тоже хорошо.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено DEAD MAN 07-06-2021 в 20:41:

Chyvachok Я конечно стримы вроде как не плохо знаю, но 9 задание сделать в скопе одного стрима мне кажется нереальным. Единственное, что пришло в голову, но это по заданию вроде как неверно, ибо чейняться 2 стрима:

code:
List<String> result = Stream.of("ABC", "A", "BCD", "D") .map(string -> new AbstractMap.SimpleEntry<>(string.charAt(0), string.length())) .collect( Collectors.collectingAndThen(Collector.of((Supplier<HashMap<Character, Integer>>) HashMap::new, (map, entry) -> { int prevSize = map.getOrDefault(entry.getKey(), 0); map.put(entry.getKey(), prevSize + entry.getValue()); }, (a, b) -> { throw new UnsupportedOperationException(); }), map -> map.entrySet() .stream())) .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .map(entry -> entry.getValue() + "-" + entry.getKey()) .collect(Collectors.toList());


Отправлено Chyvachok 08-06-2021 в 07:51:

Спасибо за ответы, осилил все, правда реализация порой либо слишком громозкая выходит, но главное чтобы работало, остальное вторично.

Конечно в скопе одного стрима все делать жутко не удобно было. Все эти функции похожи на цикл forEach, то есть перебирают лист по каждому элементу по очереди, но нету возможности как в обычном for получить следующий либо прошлый элемент, не знаю, чем эти лямбды и стримы сильно лучше обычных там циклов и прочего, ладно если один лист там отсортировать, или отсеить что-то, может оно и компактней будет, сложные операции через циклы мне кажется и компактнее и лучше будут, а тут просто мешанина была, с теми же циклами внутри методов map.


Отправлено Gandalv 08-06-2021 в 08:49:

> перебирают лист по каждому элементу по очереди,
В 99% случаев при коммерческом перекладывании джейсонов этого достаточно.

> но нету возможности как в обычном for получить следующий либо прошлый элемент
Для этого есть оператор reduce и некоторые другие операторы (не знаю как конкретно в Java). В общем, в большинстве случаев можно обойтись без циклов, если ты не реализовываешь какой-то мега сложный алгоритм)

> не знаю, чем эти лямбды и стримы сильно лучше обычных там циклов и прочего
Меньше буков, при этом легче читается. Я уж не помню, когда циклы в последний раз использовал.

__________________
Углеродные звезды с древними спутниками, которые колонизируют разумные грибы...
Газовые гиганты, на которых обитает метеорологический разум...
Миры, растянутые на мембранах, где измерения пересекаются...
Это невозможно описать нашим ограниченным языком...


Отправлено AntiPlayer 08-06-2021 в 09:29:

Цитата:
Chyvachok писал:
чем эти лямбды и стримы сильно лучше обычных там циклов и прочего


Это возможность писать в функциональном стиле.

__________________
I tell you to enjoy life


Временная зона GMT. Текущее время 09:27.
Показать все 8 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024