java lambda表达式,从一个列表list中删除存在于另外一个列表list的数据对象

一个用户列表,一个会议-用户关系表。
将用户表中,所有已经参会的人员剔除,返回没有参会人员的列表。
使用lambda表达式,相对代码非常精简,且容易理解,还能提升效率。
值得尝试。

public List<User> notInMeetingUserList(Integer meetingId, Integer companyId) throws ErrorException {
    List<YdReMeetingUser> ydReMeetingUserList = ydReMeetingUserMapper.selectByMeetingId(meetingId); // 会议-用户关系列表
    List<User> userList = userMapper.selectByCompanyId(companyId); // 企业内部所有用户列表
    if (ydReMeetingUserList == null) {
        return userList;
    }
    if (userList == null) {
        throw new ErrorException(ErrorException.CHECK_ERROR, "您好,没有找到该组织的成员信息!");
    }
    userList.removeIf(a -> {
        return ydReMeetingUserList.stream().anyMatch(b -> {
            if (b.getUserId() != null && b.getUserId().equals(a.getId())) {
                return true;
            } else {
                return false;
            }
        });
    });
    return userList;
}

一款值得使用的,免费会议室管理软件【微信小程序和网页版都有】

最近和开发团队,一起做了一个会议室管理软件。包括:组织机构入住、会议室管理、会议预约、会议管理、会议分享等功能的小程序。

适合对会议室争抢频繁,会议多的组织机构使用。

同时,能够将内部会议和外部会议区分开。能够分享会议的纪要、ppt、excel等文件。

还可以将会议分享给没有参会的同事,方便大家了解会议的决议等信息。

 

会议室管理软件小程序
会议室管理软件小程序

未来如何看比赛直播,5G、VR眼镜、太空舱的结合

那天和同事聊天,突然聊到未来5G发展,带来的全新的看直播的体验。
幻想:坐在开空仓一样的摇摇椅里,左右手里,握着两个遥感:上下左右,前后。带着VR眼镜,无限的穿梭在赛场里。
想怎么看就怎么看,想看什么就看什么。想加速就加速,想俯视就俯视,想仰视就仰视。
飘在空中看篮球比赛,躺在地上看芭蕾舞表演。
现场,则是无数个360度高清摄像头,将现场的3D画面完美的直播出去。
想想就觉得很爽。感觉自己就像是飘在空中的一个质子,随心所欲。

solr创建一对多的索引

db-data-config.xml文件的写法

<dataConfig>
    <dataSource driver="org.hsqldb.jdbcDriver"
    url="jdbc:mysql://abc.com:3306/databaseName?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;autoReconnect=true&amp;failOverReadOnly=false"
    USER="username" password="asdf"/>
    <document>
        <entity name="meeting" pk="id" transformer="DateFormatTransformer,HTMLStripTransformer,LogTransformer"
            query="select a.id, user_id, title, content, riqi, start_time, end_time, department, applicant, name
                    from yd_meeting a join yd_meeting_room b on a.room_id = b.id where a.status = 0"

            deltaImportQuery="select a.id, user_id, title, content, riqi, start_time, end_time, department, applicant, name
                    from yd_meeting a join yd_meeting_room b on a.room_id = b.id where a.status = 0 and a.id = '${dih.delta.id}' "

            deletedPkQuery="SELECT id FROM yd_meeting where status = 1 "  
            deltaQuery="select id from yd_meeting where status = 0 and update_time &gt; '${dih.last_index_time}'"
        >
            <FIELD COLUMN="id" name="id" />
            <FIELD COLUMN="user_id" name="ownerUserId" />
            <FIELD COLUMN="title" name="title" />
            <FIELD COLUMN="content" name="content" stripHTML="true"/>
            <FIELD COLUMN="riqi" name="riqi" />
            <FIELD COLUMN="start_time" name="startTime" />
            <FIELD COLUMN="end_time" name="endTime" />
            <FIELD COLUMN="department" name="department" />
            <FIELD COLUMN="applicant" name="applicant"/>
            <FIELD COLUMN="name" name="roomName"/>
           
            <entity name="summary" query="select id, user_id, content from yd_meeting_summary where meeting_id = '${meeting.id}'">
                <FIELD COLUMN="id" name="summaryId" />
                <FIELD COLUMN="user_id" name="summaryUserId" />
                <FIELD COLUMN="content" name="summaryContent" />
            </entity>
            <entity name="user" query="select id, user_id from yd_re_meeting_user where meeting_id = '${meeting.id}' and status = 0"
                deltaImportQuery="select id, user_id from yd_re_meeting_user where id = '${dih.delta.id}' "
                deletedPkQuery="SELECT id FROM yd_re_meeting_user where status = 1 "  
                deltaQuery="select id from yd_re_meeting_user where status = 0 and update_time &gt; '${dih.last_index_time}'"
            >
                <FIELD COLUMN="user_id" name="userId" />
            </entity>
        </entity>
       
    </document>
</dataConfig>

managed-schema文件的写法

<field name="title" type="text_cn" indexed="true" stored="true" />
<field name="username" type="string" indexed="true" stored="true" />
<field name="content" type="text_cn" indexed="true" stored="true" />
<field name="ownerUserId"  type="string" indexed="true" stored="true" />
<field name="riqi"  type="string" indexed="true" stored="true" />
<field name="startTime"  type="string" indexed="true" stored="true" />
<field name="endTime"  type="string" indexed="true" stored="true" />
<field name="department"  type="string" indexed="false" stored="true" />
<field name="applicant" type="string" indexed="false" stored="true" />
<field name="roomName" type="string" indexed="false" stored="true" />
<field name="summaryUserId"  type="string" indexed="true" stored="true" multiValued="true"/>
<field name="summaryContent"  type="text_cn" indexed="true" stored="true" multiValued="true"/>
<field name="userId"  type="string" indexed="true" stored="true" multiValued="true"/>

重点:
multiValued=”true”

java的lambda表达式,对list进行操作

ydMeetingRoomList.removeIf(a -> a.getClosing() == 1); // 删除关闭的会议室
ydMeetingRoomList.removeIf((a)->{
    YdMeeting ydMeeting = new YdMeeting();
    ydMeeting.setRoomId(a.getId());
    ydMeeting.setRiqi(riqi);
    ydMeeting.setStartTime(startTime);
    ydMeeting.setEndTime(endTime);
    List<YdMeeting> ydMeetingList = ydMeetingMapper.countByRoomAndTime(ydMeeting);
    if(ListUtil.isNotBlank(ydMeetingList)){
        // 不是空,表示这个时间,这个会议室有会议。
        // 不能预约,所以要删除,所以返回true
        return true;
    }
    return false;
});

Centos7 利用crontab定时执行任务及配置方法

基本格式

* * * * * user-name command to be executed
定时任务的每段为:分,时,日,月,周,用户,命令

# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
定时任务的每段为:分,时,日,月,周,用户,命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

*:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59分
-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次

基本使用

crontab -l -u root #查看root用户
0 */1 * * * command
0 */2 * * * command
crontab -e #编辑定时任务,在编写时会检查语法,而echo,或者vi编辑配置时不会检查(visudo也会检查语法)
0 */1 * * * command
0 */2 * * * command

crontab文件的一些例子:
1)30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
2)45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
3)10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
4)0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。最后一次的任务执行时间为23:30

5)0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

6)* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache(错误的)
*代表每分钟就执行一次,上面的语句的意思为每隔一小时的每分钟都在执行重启apache

*/60 * * * * #每60分钟即每小时执行一次
*/105 * * * * #每105分钟执行一次

7)* 23,00-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache(错误的)

上面的定时任务的分钟为*号,代表每分钟都在执行,表示晚上23点和凌晨0-7点之间每隔一小时的每分钟都在再行重启apache

8)0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache(周和日尽量不要同时使用)
9)0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache

java使用jsoup动态变化浏览器,避开网站限制,下载网站内容

public static String getHtmlByJsoup(String url) {
    String html = "";
    Random r = new Random();
    int first = r.nextInt(7) + 55;
    int second = r.nextInt(3200);
    int fouth = r.nextInt(140);
    String agent = MessageFormat.format("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{0}.0.{1}.{2} Safari/537.36 SE 2.X MetaSr 1.0", first , second, fouth);
    Map<String, String> map = new HashMap<String, String>();
    map.put("time", DateUtil.currentTime());
    try {
        // 爬取的目标网站
        Document doc = Jsoup.connect(url).timeout(5000).data(map).ignoreContentType(true).userAgent(agent).get();
        html = doc.html();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    return html;
}

thymeleaf循环列表增加分行判断

最近做的小系统网站,模板展示的时候,需要每3个作品一行。需要在thymeleaf中增加判断。如果到第三个了,增加一对儿</div><div>反向的内容。研究了好长时间,终于实现了。记录下。

<div class="container">
    <div class="row service-v1 margin-bottom-40">
        <th:block th:each="obj,stat:${zuopinList}">
            <div class="col-md-4 md-margin-bottom-40">
                <div class="card small">
                    <div class="card-image">
                        <img class="img-responsive" th:src="'/Photos' + ${obj.pic.path + obj.pic.filename + obj.pic.extend}" src="Photos/12/14/nmy2ge4f.jpg" width="355px" height="236px" alt="">
                        <span th:utext="${obj.fileName} + '<a href=&quot;/zuopin' + ${obj.path}  + '&quot; target=&quot;_blank&quot;>下载</a></span>'" class="card-title">下载</span>
                    </div>
                    <div th:utext="${obj.miaoshu}" class="card-content">
                        <p>
                            1、制作一个可以左右移动的球拍。
                        </p>
                    </div>
                </div>
            </div>
            <th:block th:if="${stat.count % 3 == 0}" th:utext="${'</div><div class=&quot;row service-v1 margin-bottom-40&quot;>'}">
            </th:block>
        </th:block>
    </div>
</div>