powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / чот я туплю. как избавиться от фора.
24 сообщений из 24, страница 1 из 1
чот я туплю. как избавиться от фора.
    #39988402
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем, никак не воткну как в джаве это нормально сделать.. не хочу использовать древний фор.

есть класс который возвращает объект самого себя ну типа:

something.attribute("A").then().attribute("B").then().attribute("c").closeWith("D");

причем something.attribute("A").then() возвращает объект класса Something
а something.attribute("A") возвращает объект класса SomethingClosable

есть list аттрибутов где хранятся эти A, B, C, D, E

собссно вопрос как через стрим или что-то такое разложить это чтоб было так --
на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?

окей, это вообще через стримы джавовские можно разложить или только фор или какая-нибудь рекурсия?
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988406
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,

Поток слов какой-то.
Нарисуй кейс классы и сигнатуру метода
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988437
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположительно это
- рекурсия
- функциональшина
- правила вывода

Но нужно чтоб автор модульный тест нарисовал. С четким входом и выходом.

Меньше слов. Больше кода.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988460
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
не хочу использовать древний фор



эхех.. не хочу учиться, хочу жениться )))


andreykaT
something.attribute("A").then().attribute("B").then().attribute("c").closeWith("D");


это называется fluent interface , какое отношение вообще имеет к старому.. ладно-ладно, _древнему_ доброму фору?


andreykaT
собссно вопрос как через стрим или что-то такое разложить это чтоб было так --
на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?


map/filter/collect? не?
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988491
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT

на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?

окей, это вообще через стримы джавовские можно разложить или только фор или какая-нибудь рекурсия?


Не истины ради, а флейма для.

Сделал на Kotlin.
Только не придумал, как "всунуть" "closeWith" :-)

<:o)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
open class Attribute(val name: String) {
    override fun toString(): String {
        return "Attribute(name='$name')"
    }
}

class A:Attribute("A")
class B:Attribute("B")
class C:Attribute("C")
class D:Attribute("D")
class E:Attribute("E")

val list: Array<Attribute> = arrayOf(A(),B(),C(),D(),E())


open class Something(
    val a: A? ,
    val b: B?,
    val c: C?,
    val d: D?,
    val e: E?
) {
    fun attribute(attribute: Attribute): SomethingClosable =
        when(attribute) {
            is A -> SomethingClosable( a = attribute, b = this.b, c = this.c, d = this.d, e = this.e  )
            is B -> SomethingClosable( a = this.a, b = attribute, c = this.c, d = this.d, e = this.e  )
            is C -> SomethingClosable( a = this.a, b = this.b, c = attribute, d = this.d, e = this.e  )
            is D -> SomethingClosable( a = this.a, b = this.b, c = this.c, d = attribute, e = this.e  )
            is E -> SomethingClosable( a = this.a, b = this.b, c = this.c, d = this.d, e = attribute  )
            else -> throw Exception("Unknown attribute")
        }



    override fun toString(): String {
        return "Something(a=$a, b=$b, c=$c, d=$d, e=$e)"
    }


}

class SomethingClosable(a:A?, b:B?, c:C?, d:D?, e:E?): Something(a,b,c,d,e) {
    fun then(): Something =
        Something(a,b,c,d,e)

    fun closeWith(attr: Attribute): SomethingClosable =
        attribute(attr)
}

fun main(args: Array<String>) {

    val result = list.fold(Something(null,null,null,null,null)){ acc: Something, attribute:Attribute  ->
        acc.attribute(attribute).then()
    }

    println(result)

}
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988725
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
andreykaT
не хочу использовать древний фор



эхех.. не хочу учиться, хочу жениться )))


andreykaT
something.attribute("A").then().attribute("B").then().attribute("c").closeWith("D");


это называется fluent interface , какое отношение вообще имеет к старому.. ладно-ладно, _древнему_ доброму фору?


andreykaT
собссно вопрос как через стрим или что-то такое разложить это чтоб было так --
на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?


map/filter/collect? не?

да. ты прав. из списка должен сконструироваться объект построенный на классе имплементирующем флюентинтерфейс.

самое банальное чего в джаве нет но вроде есть в листутилзах:

на входе:
List(1,3,5,6)

а на выходе это:
list.add(1).add(3).add(5).add(6).close()

нужно сделать БЕЗ фора. через стримы коллекторы и т.п.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988726
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
hVostt
пропущено...



эхех.. не хочу учиться, хочу жениться )))


пропущено...


это называется fluent interface , какое отношение вообще имеет к старому.. ладно-ладно, _древнему_ доброму фору?


пропущено...


map/filter/collect? не?

да. ты прав. из списка должен сконструироваться объект построенный на классе имплементирующем флюентинтерфейс.

самое банальное чего в джаве нет но вроде есть в листутилзах:

на входе:
List(1,3,5,6)

а на выходе это:
list.add(1).add(3).add(5).add(6).close()

нужно сделать БЕЗ фора. через стримы коллекторы и т.п.


fold чем не устраивает?
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988751
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в джавастримах искаропки есть фолд?
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988757
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
в джавастримах искаропки есть фолд?

Не знаю, должен быть какой нибудь reduce как минимум
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988778
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
редьюс это не фолд. он на выходе требует тип равный типу элемента стрима.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988779
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так подозреваю что коллект может быть похожим. но это не точно.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39988783
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreykaT
редьюс это не фолд. он на выходе требует тип равный типу элемента стрима.

В джавовских стримах есть оба (и с тем же типом, и с новым). По сути можно как-то так:
Код: java
1.
2.
        Something reduce = Arrays.asList(1, 2, 3, 4, 5).stream()
                .reduce(new Something(), (s, i) -> s.attribute(i).then(), (s1, s2) -> null);


Если надо часто делать и с закрытием, то можно и свой коллектор бахнуть
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989580
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин. и как ты это делаешь?

у меня продолжение...

есть инпут:

String a = "apple|banana+potato+carrot-tomato"

происходит магия стримов и получается аутпут:

f.bool().must("apple")
.must("banana")
.should("potato")
.should("carrot")
.mustNot("tomato")

как сделать с фором индексом и кучей ифов вроде понятно. а как сделать по-человечески?
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989590
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
как сделать с фором индексом и кучей ифов вроде понятно.


А почему вы считаете, что это не по-человечески?

На деле когда вагон абстракций затаскивают там, где нужен простой фор, получается какаха.
И вёдры слёз, кому это поддерживать.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989597
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, форы как раз и нечитаемы. А разложить процесс на стримы с мапами флатмапами редусами и коллектами каунтами и тп вот это то что надо) но это мое мнение
Как то так вышло что я наверное форов в проще написал меньше чем пальцев на двух руках
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989602
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если есть стремление к функциональщине, то можно посмотреть что-то типа такого. Но боюсь, на практике, для удобства сопровождения - циклы наше все.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
package org.test;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;

public class BananaPsvm {

    public static void main(String[] args) {
        var str = "apple|banana+potato+carrot-tomato";
        var result = Pattern.compile("(\\W)?(\\w+)")
                .matcher(str)
                .results()
                .reduce(new Builder(), (b, value) -> b.action(value.group(1), value.group(2)), (b1, b2) -> null)
                .finalResult;
        System.out.println(result);
    }

    public static class Builder {
        public String finalResult = "";

        private Map<String, Function<String, Builder>> actions = new HashMap<>() {{
            put("|", (value) -> must(value));
            put("+", (value) -> should(value));
            put("-", (value) -> mustNot(value));
        }};

        public Builder must(String value) {
            finalResult += "must: " + value + "; ";
            return this;
        }

        public Builder should(String value) {
            finalResult += "should: " + value + "; ";
            return this;
        }

        public Builder mustNot(String value) {
            finalResult += "mustNot: " + value + "; ";
            return this;
        }

        public Builder action(String sign, String value) {
            return actions.getOrDefault(sign, this::must).apply(value);
        }
    }
}

...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989625
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача как обычно описана в терминах юнца, первый раз покупающего презерватив.
Но судя по тому что я понял, это обычный парсер, причем парсер с состоянием, поэтому если хочется оставаться функциональным то тут применяется монада State, но блин в java?? Серьезно? либо не выеб..ться и нагуглить любой способ реализации парсера, тот же рекурсивный спуск. Хотя если нет вложенности можно на обычном foldMap заимплементить
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989705
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используй goto, вместо устаревшего for'а
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989715
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
Мне кажется, форы как раз и нечитаемы. А разложить процесс на стримы с мапами флатмапами редусами и коллектами каунтами и тп вот это то что надо) но это мое мнение
Как то так вышло что я наверное форов в проще написал меньше чем пальцев на двух руках
да. У тебя склонность к функциональщине. Увы.
Сам решай. Ищи нишу)))
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39989716
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
используй goto, вместо устаревшего for'а
+5)))))
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39990095
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то нам лет 10 назад чел подогнал исходник "Пентамино". Где goto был очень даже кстати.
Я отдельным челенджем подниму пятничный топик на тему рефакторинга этого кода.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39990120
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
используй goto, вместо устаревшего for'а

гото - это долбаные ивенты. особенно синхронные.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39990123
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goto - прекрасен. Без него не будет ассемблера. Но нам это уже неактуально.
...
Рейтинг: 0 / 0
чот я туплю. как избавиться от фора.
    #39990128
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan
Если есть стремление к функциональщине, то можно посмотреть что-то типа такого. Но боюсь, на практике, для удобства сопровождения - циклы наше все.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
package org.test;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;

public class BananaPsvm {

    public static void main(String[] args) {
        var str = "apple|banana+potato+carrot-tomato";
        var result = Pattern.compile("(\\W)?(\\w+)")
                .matcher(str)
                .results()
                .reduce(new Builder(), (b, value) -> b.action(value.group(1), value.group(2)), (b1, b2) -> null)
                .finalResult;
        System.out.println(result);
    }

    public static class Builder {
        public String finalResult = "";

        private Map<String, Function<String, Builder>> actions = new HashMap<>() {{
            put("|", (value) -> must(value));
            put("+", (value) -> should(value));
            put("-", (value) -> mustNot(value));
        }};

        public Builder must(String value) {
            finalResult += "must: " + value + "; ";
            return this;
        }

        public Builder should(String value) {
            finalResult += "should: " + value + "; ";
            return this;
        }

        public Builder mustNot(String value) {
            finalResult += "mustNot: " + value + "; ";
            return this;
        }

        public Builder action(String sign, String value) {
            return actions.getOrDefault(sign, this::must).apply(value);
        }
    }
}



спсибо, бро. ты единственный кто открыл мне глаза и сказал что редьюз это не только х,у->х+у
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / чот я туплю. как избавиться от фора.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]