powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Пятничный Best practices.
25 сообщений из 76, страница 1 из 4
Пятничный Best practices.
    #38554098
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!

Вот такой вот пятничный говнокодец.

Очень часто нужно сортировать сущности в коллекциях по разным колонкам.
В настоящий момент это уродство выглядит вот так.

Entity.java

Код: 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.
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

public class FuckenEntity {

    private BigInteger account;
    private String clientName;
    private Date clientActivityDate;
    private String clientSubType;
    private BigDecimal clientBalance;

    public BigInteger getAccount() {
        return account;
    }

    public void setAccount(BigInteger account) {
        this.account = account;
    }

    public String getClientName() {
        return clientName;
    }

    public void setClientName(String clientName) {
        this.clientName = clientName;
    }

    public Date getClientActivityDate() {
        return clientActivityDate;
    }

    public void setClientActivityDate(Date clientActivityDate) {
        this.clientActivityDate = clientActivityDate;
    }

    public String getClientSubType() {
        return clientSubType;
    }

    public void setClientSubType(String clientSubType) {
        this.clientSubType = clientSubType;
    }

    public BigDecimal getClientBalance() {
        return clientBalance;
    }

    public void setClientBalance(BigDecimal clientBalance) {
        this.clientBalance = clientBalance;
    }
}



SortProcessor
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanNameAware;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import static java.lang.String.format;
import static java.lang.String.format;

public class FuckenEntityProcessor implements BeanNameAware {

    private static Logger logger = Logger.getLogger(FuckenEntityProcessor.class);

    /**
     *
     * @param FuckenEntitys - fucken collection to sort (out)
     * @param nField - number of field (Just like SELECT .... FROM ... ORDER by nField )
     * @param direction - direction of sorting like { ASC | DESC }
     */
    public static void sort(List<FuckenEntity> FuckenEntitys, int nField, int direction) {
        if (direction == 0 || direction == 1) {
            if (FuckenEntitys != null && FuckenEntitys.size() > 0) {
                try {
                    if (nField == 0) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getAccount()==null && o2.getAccount()==null) return 0;
                                if (o1.getAccount()==null) return 1;
                                if (o2.getAccount()==null) return -1;
                                return o1.getAccount().compareTo(o2.getAccount());
                            }
                        });
                    } else if (nField == 1) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientName()==null && o2.getClientName()==null) return 0;
                                if (o1.getClientName()==null) return 1;
                                if (o2.getClientName()==null) return -1;
                                return o1.getClientName().compareTo(o2.getClientName());
                            }
                        });
                    } else if (nField == 2) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientActivityDate()==null && o2.getClientActivityDate()==null) return 0;
                                if (o1.getClientActivityDate()==null) return 1;
                                if (o2.getClientActivityDate()==null) return -1;
                                return o1.getClientActivityDate().compareTo(o2.getClientActivityDate());
                            }
                        });
                    } else if (nField == 3) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientSubType()==null && o2.getClientSubType()==null) return 0;
                                if (o1.getClientSubType()==null) return 1;
                                if (o2.getClientSubType()==null) return -1;
                                return o1.getClientSubType().compareTo(o2.getClientSubType());
                            }
                        });
                    } else if (nField == 4) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientBalance()==null && o2.getClientBalance()==null) return 0;
                                if (o1.getClientBalance()==null) return 1;
                                if (o2.getClientBalance()==null) return -1;
                                return o1.getClientBalance().compareTo(o2.getClientBalance());
                            }
                        });
                    }
                    if (direction==1) Collections.reverse(FuckenEntitys);
                } catch (Exception ex) {
                    logger.error(
                            format("Exception while sorting FuckenEntitys param = %d,dir = %d",
                                    nField, direction), ex
                    );
                }
            }
        }
    }

    ................
}



Обычно List<entity> связана 1:1 с GWT FlexTable и отображается на UI пользователя
как есть.

Сортировать на стороне источника данных не всегда возможно. Где БД - мы
как-то сортируем а вот из rest-сервисов приходится делать всё самим.

Встроенные DBMS (Derby, HyperSonic, H2) мы не используем.

Сами entities лежат в скоупе GWT компилляции и имеют поля только основных
примитивных типов (int, String, Date, BigDecimal). Сложные объекты
я пока не встречал.

Вопрос:

Как сортировать универсально?

Нужен какой-то компонент (SpringBean) которому на вход приходит
неизвестная коллекция List<Object> и номер колонки и direction (ASC|DESC)
по которой надо сортировать и на выходе мы имеет отсортированное.

Буду рад выслушать идеи, Best Practices и почитать исходники.

Спасибо!

P.S. Реверс тоже радует :)

P.P.S Фух. Написал таки. Пятница ... мать ее так.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554102
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А reflection не спасет отца русской демократии?
Если нужна производительность, то что-то типа CGLIB

AFAIK & IMHO. Я бы в этом направлении делал, но осторожно, думая о производительности.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554109
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Codegeneration меня точно спасёт. Не утонуть-бы...
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554125
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://tips4java.wordpress.com/2008/10/23/bean-comparator/
говнокод, говнокодом, но тут ещё какой-то тупак с индексом поля. Кто придумал свойства через int адресовать?
В остальном, всё достаточно примитивно. Надо тупо избавиться от копипаста и станет более менне адекватно. Попробую изобразить.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554141
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Processor {

    public static void sort(List<Entity> entities, final int nField, int direction) {
        Collections.sort(entities, new EntityComparator() {
            @Override
            Comparable get(Entity e) {
                switch (nField){
                    case 0: return e.getAccount();
                    case 1: return e.getClientName();
                    case 2: return e.getClientActivityDate();
                    case 3: return e.getClientSubType();
                    case 4: return e.getClientBalance();
                }
                throw new IllegalArgumentException("No field for index " + nField);
            }
        });
    }

    abstract static class EntityComparator implements Comparator<Entity> {
        @Override
        public int compare(Entity e1, Entity e2) {
            Comparable c1 = get(e1);
            Comparable c2 = get(e2);
            if (c1 == null && c2 == null) return 0;
            if (c1 == null) return 1;
            if (c2 == null) return -1;
            return c1.compareTo(c2);
        }

        abstract Comparable get(Entity e);
    }
}
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554144
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

блин, прогнал немного.
Код: 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.
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Processor {

    public static void sort(List<Entity> entities, final int nField, int direction) {
        Collections.sort(entities, new EntityComparator<Entity>() {
            @Override
            Comparable get(Entity e) {
                switch (nField){
                    case 0: return e.getAccount();
                    case 1: return e.getClientName();
                    case 2: return e.getClientActivityDate();
                    case 3: return e.getClientSubType();
                    case 4: return e.getClientBalance();
                }
                throw new IllegalArgumentException("No field for index " + nField);
            }
        });
    }

    abstract static class EntityComparator<T> implements Comparator<T> {
        @Override
        public int compare(T e1, T e2) {
            Comparable c1 = get(e1);
            Comparable c2 = get(e2);
            if (c1 == null && c2 == null) return 0;
            if (c1 == null) return 1;
            if (c2 == null) return -1;
            return c1.compareTo(c2);
        }

        abstract Comparable get(T e);
    }
}
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554157
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
switch..case можно смело в саму entity унести
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О. Спасибо попробую. С entities такой трабл что компилируются они плагином gwt-maven-plugin
а с этим есть различные language limitations. Не всё что есть в Java компилируется в GWT.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554652
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz
Код: java
1.
    abstract static class EntityComparator<T> implements Comparator<T> 


Рекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator)
http://commons.apache.org/proper/commons-beanutils/
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554682
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton ,
Если интересно сделать именно самому, то я бы смотрел банально в сторону рефлекшена и Unsafe:
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
public class Sorter {
    private static Unsafe UNSAFE = unsafe();

    public static <T> List<T> sort(List<T> src, Class cls, String fieldName, final SortOrder sortOrder)
        throws Exception {
        Field field = cls.getDeclaredField(fieldName);

        final FieldType type = fieldType(field);

        final long offset = UNSAFE.objectFieldOffset(field);

        Collections.sort(src, new Comparator<T>() {
         @Override public int compare(T o1, T o2) {
             switch (type) {
                 case INT:
                     return compareInt(o1, o2, offset, sortOrder);

                 // Все остальные примитивы.

                 default:
                     assert type == FieldType.OBJECT;

                     return compareObject(o1, o2, offset, sortOrder);
             }
         }
        });

        return src;
    }

    private static int compareInt(Object o1, Object o2, long offset, SortOrder sortOrder) {
        int val1 = UNSAFE.getInt(o1, offset);
        int val2 = UNSAFE.getInt(o1, offset);

        int res = val1 < val2 ? -1 : val1 == val2 ? 0 : 1;

        if (sortOrder == SortOrder.DESC)
            res = res * -1;

        return res;
    }

    // Все остальные примитивы.

    private static int compareObject(Object o1, Object o2, long offset, SortOrder sortOrder) {
        Object val1 = UNSAFE.getObject(o1, offset);
        Object val2 = UNSAFE.getObject(o1, offset);

        return applySortOrder(((Comparable)val1).compareTo(val2), sortOrder);
    }

    private static int applySortOrder(int res, SortOrder sortOrder) {
        return sortOrder == SortOrder.ASC ? res : res * -1;
    }


    private static FieldType fieldType(Field field) {
        // Тут определите тип поля.
        // TODO.
    }

    private static Unsafe unsafe() {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");

            f.setAccessible(true);

            return (Unsafe)f.get(null);
        }
        catch (Exception e) {
            throw new RuntimeException("Failed to get Unsafe instance.");
        }
    }

    private static enum FieldType {
        INT,

        // Все стальные примитивы.

        OBJECT
    }
}

Разумеется, это только концепт, для демонстрации идеи. Для пущей няшности можно заморочиться, например, с аннотациями и кэшем дескрипторов конкретного класса. Например, фигачите на полях, по которым можно сортировать аннотацию Sortable. Потом, каким-нибудь образом регистрируете этот класс в сортировщике. Он проверяет консистентность. Например, что все reference поля реализуют Comparable. А потом кэширует дескриптор этого класса у себя. И когда вы будете вызывать непосредственно сортировку, то он просто вытащит дескриптор из кэша, быстро поймет, как именно надо обработать это поле, и все буде круто.

Ну и прочих фишек и оптимизаций уже сами нафигачите. Например, проверять SortType можно один раз на весь процесс сортировки, а не на каждом сравнении, как у меня. Можно передавать опциональный Comparator. И т.д..

Но вообще, как сказали выше, такое наверняка уже давным давно есть в каких-нибудь утилитарных библиотеках.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554685
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554704
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шняга какая-то, зачем рефлекшн.
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
    class Column<ENTITY, VALUE> {
        private final Getter<ENTITY, VALUE> getter;
        private final Comparator<VALUE>     comparator;

        public Getter<ENTITY, VALUE> getGetter() {
            return getter;
        }

        public Comparator<VALUE> getComparator() {
            return comparator;
        }

        Column(Getter<ENTITY, VALUE> getter, Comparator<VALUE> comparator) {
            this.getter = getter;
            this.comparator = comparator;
        }

        int compare(ENTITY e1, ENTITY e2) {
            return comparator.compare(getter.get(e1), getter.get(e2));
        }
                
    }

    static final Comparator<BigInteger> BIG_INT = new Comparator<BigInteger>() {
        @Override
        public int compare(BigInteger o1, BigInteger o2) {
            return o1.compareTo(o2);
        }
    };
    
    static final Comparator<String> STRING = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    };

    interface Getter<ENTITY, T> {
        T get(ENTITY e);
    }

    class FuckenEntity {

        private BigInteger account;
        private String     clientName;

        public static final Getter<FuckenEntity, BigInteger> ACCOUNT = new Getter<FuckenEntity, BigInteger>() {
            @Override
            public BigInteger get(FuckenEntity e) {
                return e.account;
            }
        };

        public static final Getter<FuckenEntity, String> CLIENT_NAME = new Getter<FuckenEntity, String>() {
            @Override
            public String get(FuckenEntity e) {
                return e.clientName;
            }
        };
    }

    <E> void sort(final List<E> fuckenEntitys, final List<? extends Column> fuckenColumns) {

        Comparator<E> fuckenComparator = new Comparator<E>() {
            @Override
            public int compare(E o1, E o2) {
                for (Column column : fuckenColumns) {
                    int compare = column.compare(o1, o2);
                    if (compare != 0)
                        return compare;
                }
                return 0;
            }

            @Override
            public boolean equals(java.lang.Object obj) {
                return false;
            }
        };

        Collections.sort(fuckenEntitys, fuckenComparator);
    }

    
    void primer(List<FuckenEntity> list){
        Column<FuckenEntity, BigInteger> column1 = new Column<FuckenEntity, BigInteger>(FuckenEntity.ACCOUNT, BIG_INT);
        Column<FuckenEntity, String> column2 = new Column<FuckenEntity, String>(FuckenEntity.CLIENT_NAME, STRING);

        sort(list, Arrays.asList(column1, column2));
    }
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554745
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvПлюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать
Это тема. +1
Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть
1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554843
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraРекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator)
http://commons.apache.org/proper/commons-beanutils/
Мне не нужно ничего рекомендовать, я вопросов не задавал. BeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554844
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто тема. +1
Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть
1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов.
Сортировка клиентская или серверная? В любом случае зачем пул, если на сервере компаратор быстро издохнет в молодом поколении, а на клиенте никто не будет так часто и постоянно сортировать все возможные интерфейсы.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554845
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман,
А зачем столько новых бестолковых Comparator для типов, которы уже реализуют Comparable?
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554861
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман, y нас есть необходимость сортировать также null значения.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554882
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
А так ли нужен вам List<FuckenEntity> ?
Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов.

Ну и можно класс отдельный создать Matrix<T extends Comparable>,
который будет еще и описания колонок внутри себя хранить.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554884
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTIDMatrix<T extends Comparable>
Не так, правильнее Matrix<? extends Comparable>
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554892
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczBeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton
Все так, но доступ к геттерам в BeanComparator кешируется, так что расходы на рефлексию (в большой коллекции, либо при многократной сорировке) сводятся к вызову этих геттеров, что сравнимо по производительности с работой через интерфейсы. Поэтому BeanComparator не такой уж и медленный, как кажется на первый взгляд.
Конечно, хардкод будет самый быстрый, но можно ли это считать Best practices?
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554932
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554955
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MonochromatiqueВ каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/

Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :)
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554960
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MonochromatiqueВ каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/ Надежда на Java 8 .
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38554962
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominMonochromatiqueВ каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/

Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :)

Да как бы нет проблем. ))


Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name)

На что я кстати и привел ссылку. Просто ты наверное не понял.
...
Рейтинг: 0 / 0
Пятничный Best practices.
    #38555003
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MonochromatiqueAlexey Tominпропущено...
Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :)

Да как бы нет проблем. ))

Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name)


Будет в JDK8

MonochromatiqueНа что я кстати и привел ссылку. Просто ты наверное не понял.

Я не понял, что ты этим хотел сказать, да :)
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Пятничный Best practices.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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